ZOJ 3787 Access System

来源:互联网 发布:反杀电影 知乎 编辑:程序博客网 时间:2024/05/18 06:31

ZOJ   3787   Access System

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3787

2014 第十一届浙江省赛 L

题目大意:进门系统模拟。进宿舍门要刷身份卡,但是有人刷卡进了门,L秒之内想进的人就不需要刷了,大家都很懒,能不刷就不刷。给出n个人的到来时间(无序),和刷卡后门会保持开启状态的时间,问哪些人需要刷卡(按给出的顺序算)。

题目分析:结构体存,时间存在一个整数里,另外就是记录给出时的编号和是否需要刷卡的布尔变量。按到来时间排序后顺着刷一遍,得到每个人是否需要刷卡的结果(注意无论如何第一个人是要刷的),然后再按给出顺序排回来输出。

code:

#include<cstdio>#include<algorithm>using namespace std;struct stu{    int time,num;    bool need;}a[20010];bool cmp1(stu a,stu b){    return a.time<b.time;}bool cmp2(stu a,stu b){    return a.num<b.num;}int main(){    int i,j,h,m,s,n,l,t,k,sum;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&l);        for(i=0;i<n;i++)        {            scanf("%d:%d:%d",&h,&m,&s);            a[i].time=(60*h+m)*60+s;            a[i].num=i+1;        }        sort(a,a+n,cmp1);        a[0].need=true;        for(sum=i=1,j=a[0].time;i<n;i++)        {            if(a[i].time>=j+l)            {                a[i].need=true;                j=a[i].time;                sum++;            }            else a[i].need=false;        }        sort(a,a+n,cmp2);        printf("%d\n",sum--);        for(i=0;i<n;i++)        {            if(a[i].need)            {printf("%d%s",a[i].num,sum==0?"\n":" ");sum--;}        }    }    return 0;}/*32 112:30:0012:30:015 1517:00:0017:00:1517:00:0617:01:0017:00:143 512:00:0912:00:0512:00:00*/

PS:1A




0 0
原创粉丝点击