Problem Description
2115年的时候,地球人口已经突破**亿,这个时候高铁这种落后的交通工具因为座椅数目固定行车效率低下而被淘汰了,取而代之的是天才科学家晓楠发明的楠车。楠车具有各种各样的优点比如速度高达500m/s,没有加速时间,开车就能达到最大速度,甚至能够每一秒停一次车,另外最显著的一点就是在发车前可以自由的调整座位数目,这样就可以让楠车的运行效率大大提高!真是一个跨时代的发明。
楠车的速度极快,车上的每一个人都必须要有一个座位,如果站着的话会发生生命危险。
不过如果想要楠车的运行达到最有效率的状态,我们需要在发车前就计算出这一个车次最少需要多少个座位,天才科学家晓楠在这里突然不知道该怎么计算了,不过幸运的是,我们已经收集到了每个人的上车和下车的时间。聪明的你,能帮助晓楠解决这个问题吗?
当在一个时间点同时有人上车和下车的时候,我们遵循先下后上的规则,也就是说如果车上还有人要下车的时候,上车的人会一直等到想要下车的人全部下车为止。
Input
多组输入,第一行为一个T,代表一共有T组数据(T < = 10)
接下来每一组数据第一行都是一个整数n,代表一共有n个人来乘车(n < = 100000)
接下来有n行,每一行两个整数L,R(0 < = l < = r < = 1000000000)(以秒为单位)
分别代表这个人的上车和下车时间
Output
每组数组输出一行一个整数,代表这一发车至少需要的座位数
Sample Input
2
3
1 2
2 3
5 7
3
1 9
2 8
3 7
Sample Output
1
3
先将输入的n组数据按照上车时间从小到大排序,排完序后对于每组数据,与在它之前的每组数据进行比较,如果存在这组数据的上车时间比前面的某组数据的下车时间小,则计数加一,对于每组数据都能得到一个当时所需要的座位数,最后将这些座位数进行比较,找出最大的数,则是最终结果。
#include <stdio.h>
#include <stdlib.h>
struct bus
{
int a;
int b;
} s[110000];
void kp(struct bus s[],int l,int r)//用快排防止超时
{
struct bus key;
int i,j;
key=s[l];
i=l;
j=r;
if(l>=r)return;
while(i<j)
{
while(i<j&&s[j].a>=key.a)j--;
s[i]=s[j];
while(i<j&&s[i].a<=key.a)i++;
s[j]=s[i];
}
s[i]=key;
kp(s,l,i-1);
kp(s,i+1,r);
}
int main()
{
int t,n,i,j,sum;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%d %d",&s[i].a,&s[i].b);
}
kp(s,0,n-1);
int x=0;
for(i=0; i<n; i++)
{
sum=1;
for(j=0; j<i; j++)
{
if(s[i].a<s[j].b)
sum++;
}
if(sum>x)x=sum;//找出最大的数
}
printf("%d\n",x);
}
return 0;
}