1263:【例9.7】友好城市
# 题目描述
Palmia国有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的N个城市。北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同。
每对友好城市都向政府申请在河上开辟一条直线航道连接两个城市,但是由于河上雾太大,政府决定避免任意两条航道交叉,以避免事故。编程帮助政府做出一些批准和拒绝申请的决定,使得在保证任意两条航线不相交的情况下,被批准的申请尽量多。
# 输入
第1行,一个整数
第2行到第n+1行,每行两个整数,中间用1个空格隔开,分别表示南岸和北岸的一对友好城市的坐标。(0≤xi≤10000)
# 输出
仅一行,输出一个整数,表示政府所能批准的最多申请数。
# 样例
# 输入样例
7
22 4
2 6
10 3
15 12
9 8
17 17
4 2
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 输入样例
4
1
# 思路
对北岸(或南岸)的城市从小到大排序,再求南岸(或北岸)的城市位置的最长不下降序列长度即可。
# 源代码
#include <cstdio>
#include <iostream>
#define N 5010
#define INF 0X3F3F3F3F
using namespace std;
struct node { //北南两个点坐标 a,b
int a;
int b;
} q[N];
int f[N];
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) //输入数据
cin >> q[i].a >> q[i].b;
for (int i = 1; i <= n; i++) //前面数据坐标进行排序
for (int j = i + 1; j <= n; j++) {
if (q[i].a > q[j].a)
swap(q[i], q[j]);
else if (q[i].a ==
q[j].a) //如果前面数据相等,比较后面坐标数据 进行排序
{
if (q[i].b > q[j].b) swap(q[i], q[j]);
}
}
int maxx = -INF; //初始化做大值
for (int i = 1; i <= n; i++) {
f[i] = 1;
for (int j = 1; j < i; j++)
if (q[j].b <= q[i].b &&
f[j] + 1 >
f[i]) //求南岸(或北岸)的城市位置的最长不下降序列长度
f[i] = f[j] + 1;
maxx = max(maxx, f[i]);
}
cout << maxx << endl;
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
上次更新: 2022/03/08, 01:01:22