您的位置:首页 > 其它

HDU 4509 湫湫系列故事——减肥记II(模拟)

2014-04-10 17:46 363 查看
题目:
http://acm.hdu.edu.cn/showproblem.php?pid=4509
题解:

1.按事情的开始时间排序

2.设strattime与endtime的初值为第一件事情的开始时间与结束时间

3.遍历所有事情,对于遍历到的事情,该事情的开始时间有两种情况,

情况A:在starttime与endtime之间,与前一时间段有重叠,更新endtime=max(endtime,该事情的结束时间)。

情况B:在endtime之后,那么与前一段时间无重叠。统计前一时间段之差,更新starttime为该事情的开始时间,endtime为该事情的结束时间。

4.遍历完后,最后一个时间段的时间未统计,要统计。

代码:

#include<cstdio>
#include<stdlib.h>
const int maxn=500005;
struct time
{
int start;
int end;
}t[maxn];
int cmp(const void*a,const void*b)
{
time*c=(time*)a;
time*d=(time*)b;
return c->start-d->start;
}
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int N;
while(~scanf("%d",&N))
{
int a,b,c,d;
char ss;
int i;
for(i=0;i<N;i++)
{
scanf("%d%c%d%d%c%d",&a,&ss,&b,&c,&ss,&d);
t[i].start=a*60+b;
t[i].end=c*60+d;
}
qsort(t,N,sizeof(t[0]),cmp);
int starttime=t[0].start,endtime=t[0].end;
int alltime=0;
for(i=1;i<N;i++)
{
if(t[i].start<=endtime)
{
endtime=max(endtime,t[i].end);
}
else
{
alltime+=(endtime-starttime);
starttime=t[i].start;
endtime=t[i].end;
}
}
alltime+=(endtime-starttime);
printf("%d\n",1440-alltime);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: