题目一:
【题目描述】
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
【来源】
【思路】:把男岸从小到大排序,然后北列求最长上升子序列
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; }
原文地址:https://www.cnblogs.com/pyyyyyy/p/10774097.html