ECJTU16年ACM“双基”程序设计竞赛1007题

来源:互联网 发布:二战收藏夹知乎 编辑:程序博客网 时间:2024/04/30 11:24

acm小学妹

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 10   Accepted Submission(s) : 5

Problem Description

ACM小学妹在今天的暑假训练结束后,想看球赛放松一下。当他打开电脑时查询到联盟今天直播N场球赛,每场球赛的起止时间(S1,E1),(S2,E2),...,(SN,EN)。现在小学妹想今天看完所有的球赛直播,不至于留到明天看重播了,毕竟明天依旧是要训练的。当小学妹看完这场球赛要切换到其他球赛时是不需要时间的。现在小学妹用自己训练用的电脑来看球赛,但是可能不够。毕竟小学妹自己的电脑最多只能同时播放1场直播,现在小学妹需要借一些电脑来同时播放球赛。本来小学妹自己是可以求出最少需要借多少台电脑来同时观看的,但是今天训练太累了,你可以帮助他吗?

Input

包含多组输入,第一行输入一个整数N(1≤N≤100000),表示任务的数目。以下N行每行两个整数Si,Ei,(0≤Si<Ei≤1000000000),表示任务的起至时间。

Output

输出小学妹最少需要借的电脑数目。

Sample Input

51 102 76 93 47 10

Sample Output

2

思路:扫描线算法
考虑把这些线段放在时间轴上
设想有一根线从左往右扫
那么全过程中,这根线和最多线段相交的时候
这个相交次数就是答案
那么现在这根线从左往右扫描
对每条线段来说会有两个事件
扫描线碰到线段左端点,相交次数+1
扫描线碰到右端点,相交次数-1
把所有这样的事件抓出来排个序
然后扫一遍就行了
*关于时间排序 复杂度是 nlogn 
每场球赛的起始时间s:x=s,y=1;每场球赛的终止时间e:x=e,y=-1,按x非递减排序,x相同按y非递减排序。输出y的前缀和的最大值。

 
#include<stdio.h>
#include<algorithm>
using namespace std; 
struct time
{
int x;
int y;
}node[200001];
bool cmp(time a,time b)
{
if(a.x!=b.x)
return a.x<b.x;
else return a.y<b.y;
}
int main()
{
int n,i;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<2*n;i++)
{
scanf("%d",&node[i].x);
if((i+2)%2==0) node[i].y=1;
else node[i].y=-1;
}
sort(node,node+2*n,cmp);
int maxn=0;
int count=0;
for(int i=0;i<2*n;i++)
{
count+=node[i].y;
if(count>maxn) maxn=count;
}
printf("%d\n",maxn-1);
}
return 0;
 }
0 0
原创粉丝点击