首页 > 代码库 > 洛谷P2782 友好城市

洛谷P2782 友好城市

P2782 友好城市

    • 392通过
    • 698提交
  • 题目提供者Drench
  • 标签 2001(或之前) 云端
  • 难度 普及-
  • 时空限制 1s / 128MB

     

题目背景

题目描述

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

输入输出格式

输入格式:

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

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

输出格式:

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

输入输出样例

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

说明

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

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<string>
 6 #include<cmath>
 7 
 8 using namespace std;
 9 const int N=5001;
10 
11 struct node{
12     int up,down;
13 }E[N];
14 
15 int b[N];
16 
17 inline bool cmp(node a,node b)
18 {
19     return a.up<b.up;
20 }  
21 
22 int main()
23 {
24     int n;
25     scanf("%d",&n);
26     for(int i=1;i<=n;i++)
27     {
28         scanf("%d%d",&E[i].down,&E[i].up);
29     }
30     sort(E+1,E+n+1,cmp);
31     
32     int ans=-1;
33     for(int i=1;i<=n;i++)
34     {
35         b[i]=1;
36         for(int j=1;j<i;j++)
37         {
38             if(E[j].down<=E[i].down&&b[j]+1>b[i])
39             {
40                 b[i]=b[j]+1;
41             }
42         }
43         ans=max(ans,b[i]);
44     }
45     printf("%d",ans);
46     return 0;
47 }

 

明显的最长上升子序列

先将北岸按从小到大排序,然后求南岸的最长上升子序列

洛谷P2782 友好城市