题目描述

    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

思路

将两岸的城市位置按任意一岸城市位置排序,再求出另外一岸城市位置的最长不下降子数列的长度即可。

代码

#include<stdio.h>
int a[],b[][]={};
int main()
{int c,d,n,i,j,p;
scanf("%d%d%d",&c,&d,&n);
for(i=;i<=n;i++)
{
scanf("%d%d",&a[i],&b[i][]);
b[i][]=;
}
for(i=;i<=n-;i++)
for(j=;j<=n-i;j++)
if(a[j]>a[j+])
{
p=a[j];
a[j]=a[j+];
a[j+]=p;
b[][]=b[j][];
b[j][]=b[j+][];
b[j+][]=b[][];
}
p=;
for(i=;i<=n;i++)
for(j=i+;j<=n;j++)
{
if(b[i][]<b[j][]&&b[i][]>=b[j][])
b[j][]=b[i][]+;
if(b[j][]>p)
p=b[j][];
}
printf("%d",p);
return ;
}
04-27 01:47