• 【dp】友好城市


    题目一:

    【题目描述】

    Palmia国有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的N个城市。北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同。

    每对友好城市都向政府申请在河上开辟一条直线航道连接两个城市,但是由于河上雾太大,政府决定避免任意两条航道交叉,以避免事故。编程帮助政府做出一些批准和拒绝申请的决定,使得在保证任意两条航线不相交的情况下,被批准的申请尽量多。

    【输入】

    第1行,一个整数N(1≤N≤5000),表示城市数。

    第2行到第n+1行,每行两个整数,中间用1个空格隔开,分别表示南岸和北岸的一对友好城市的坐标。(0≤xi≤10000)

    【输出】

    仅一行,输出一个整数,表示政府所能批准的最多申请数。

    【输入样例】

    7
    22 4
    2 6
    10 3
    15 12
    9 8
    17 17
    4 2

    【输出样例】

    4

    【来源】

    No

    【思路】:把男岸从小到大排序,然后北列求最长上升子序列

    ps:

    本题数据和水,O(n2)就能过

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int f[200005];
    struct road {
        int begin;
        int end;
    } a[200005];
    int cmp( road a, road b) {
        return a.begin<b.begin;
    }
    int main() {
        int n,i,j;
        cin>>n;
        for(i=1; i<=n; i++) {
            cin>>a[i].begin>>a[i].end;
            f[i]=1;
        }
        sort(a+1,a+1+n,cmp);
        for(i=2; i<=n; i++) {
            for(j=1; j<i; j++) {
                if(a[i].end>a[j].end) {
                    f[i]=max(f[i],f[j]+1);
                }
            }
        }
        int ans=0;
        for(int i=1; i<=n; ++i) {
            if(f[i]>ans) {
                ans=f[i];
            }
        }
        cout<<ans;
        return 0;
    }

    题目二:

    P2782 友好城市(luogu )

    题目描述

    有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的N个城市。北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同。每对友好城市都向政府申请在河上开辟一条直线航道连接两个城市,但是由于河上雾太大,政府决定避免任意两条航道交叉,以避免事故。编程帮助政府做出一些批准和拒绝申请的决定,使得在保证任意两条航道不相交的情况下,被批准的申请尽量多。

    输入输出格式

    输入格式:

    第1行,一个整数N,表示城市数。

    第2行到第n+1行,每行两个整数,中间用一个空格隔开,分别表示南岸和北岸的一对友好城市的坐标。

    输出格式:

    仅一行,输出一个整数,表示政府所能批准的最多申请数。

    输入输出样例

    输入样例#1: 复制
    7
    22 4
    2 6
    10 3
    15 12
    9 8
    17 17
    4 2
    输出样例#1: 复制
    4

    说明

    50% 1<=N<=5000,0<=xi<=10000

    100% 1<=N<=2e5,0<=xi<=1e6

    【思路】:和上面一样,但是需要nlogn的才能100分

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int f[200005];
    struct road {
        int begin;
        int end;
    } a[200005];
    int cmp( road a, road b) {
        return a.begin<b.begin;
    }
    int d[220000];
    int main() {
        int n,i,j;
        cin>>n;
        for(i=1; i<=n; i++) {
            cin>>a[i].begin>>a[i].end;
            f[i]=1;
        }
        sort(a+1,a+1+n,cmp);
        /*n方
        for(i=2; i<=n; i++) {
            for(j=1; j<i; j++) {
                if(a[i].end>a[j].end) {
                    f[i]=max(f[i],f[j]+1);
                }
            }
        }
        */
        /*n*log n*/
        d[1]=a[1].end;//初始化
        int len=1;
        for(i=2; i<=n; i++) {
            if(a[i].end>d[len]) {
                d[++len]=a[i].end;
            } else {
                d[lower_bound(d+1,d+1+len,a[i].end)-d]=a[i].end;
            }
        }
        /*int ans=0;
        for(int i=1; i<=n; ++i) {
            if(f[i]>ans) {
                ans=f[i];
            }
        }*/
        cout<<len;
        return 0;
    }
  • 相关阅读:
    I NEED A OFFER!
    水题 Codeforces Round #303 (Div. 2) A. Toy Cars
    模拟 HDOJ 5099 Comparison of Android versions
    模拟 HDOJ 5095 Linearization of the kernel functions in SVM
    贪心 HDOJ 5090 Game with Pearls
    Kruskal HDOJ 1863 畅通工程
    Kruskal HDOJ 1233 还是畅通工程
    并查集 HDOJ 1232 畅通工程
    DFS/并查集 Codeforces Round #286 (Div. 2) B
    水题 Codeforces Round #286 (Div. 2) A Mr. Kitayuta's Gift
  • 原文地址:https://www.cnblogs.com/pyyyyyy/p/10774097.html
Copyright © 2020-2023  润新知