題目描述 Palmia河從東往西流過Palmia國,把整個國家分成南北兩半。河的兩岸各有N個城市,北岸的每一個城市都與南岸的一個城市互為友好城市,而且任意兩個北岸城市的友好城市都不相同。每一對友好城市都向政府申請,希望開通一條連接兩城市的航線。但政府遇到一個問題:Palmia河上經常有大霧,這對航行
題目描述
Palmia河從東往西流過Palmia國,把整個國家分成南北兩半。河的兩岸各有N個城市,北岸的每一個城市都與南岸的一個城市互為友好城市,而且任意兩個北岸城市的友好城市都不相同。每一對友好城市都向政府申請,希望開通一條連接兩城市的航線。但政府遇到一個問題:Palmia河上經常有大霧,這對航行不利。為了降低出現航行事故的可能性,政府決定任意兩條航線不能交叉,這樣,政府就不一定能接受所有城市的申請。
你的任務是:寫一程式幫助政府決定接受哪些城市的申請,使開通的航線最多。
輸入輸出格式
輸入格式:
輸入數據文件Ship.in,
第一行有兩個整數,第一個整數代表Palmia河河岸線的長度(≤10000),第二個整數代表Palmia河的寬度(≤50)。
第二行有一個整數N(≤1000),表示河一側的城市數目;
以下N行每行有兩個非負整數C、D,C代表北岸城市的位置(Palmia河從西邊國界開始到該城市的距離),D代表南岸城市的位置,C和D為一對友好城市。
輸出格式:
輸出到Ship.out,
它只有一個整數,為可以獲得的最大航線數目。
輸入輸出樣例
輸入樣例#1:
Ship.in
30 4
7
22 4
2 6
10 3
15 12
9 8
17 17
4 2
輸出樣例#1:
Ship.out
4
思路
將兩岸的城市位置按任意一岸城市位置排序,再求出另外一岸城市位置的最長不下降子數列的長度即可。
代碼
#include<stdio.h> int a[1001],b[1001][2]={1}; int main() {int c,d,n,i,j,p; scanf("%d%d%d",&c,&d,&n); for(i=1;i<=n;i++) { scanf("%d%d",&a[i],&b[i][1]); b[i][2]=1; } for(i=1;i<=n-1;i++) for(j=1;j<=n-i;j++) if(a[j]>a[j+1]) { p=a[j]; a[j]=a[j+1]; a[j+1]=p; b[0][1]=b[j][1]; b[j][1]=b[j+1][1]; b[j+1][1]=b[0][1]; } p=0; for(i=1;i<=n;i++) for(j=i+1;j<=n;j++) { if(b[i][1]<b[j][1]&&b[i][2]>=b[j][2]) b[j][2]=b[i][2]+1; if(b[j][2]>p) p=b[j][2]; } printf("%d",p); return 0; }