baoge的洗漱难题[黄]
Time Limit: 5000 ms Memory Limit: 65536 KB Total Submit: 79 Accepted: 21Description
众所周知,地大19楼的盥洗室非常小,所以经常会非常拥挤,很多时候去洗漱的时候不得不排很长的队。有时候baoge会排上半小时的队才洗漱完,所以他非常苦恼。终于有一天,他再也受不了去排队洗漱了。所以他下定决心,”now or never!”。要么一去就马上洗漱,要么不去洗漱继续睡觉。 baoge是个有良好作息规律的coder,所以他每天只有在限定的时间段里才去洗漱,洗漱时间为m分钟。因为饱受排队洗漱的困扰,baoge在洗漱的时候不希望人数多于k( 其他人)人,不然他是不会去洗漱的(即使在他洗漱开始身边少于k人,但是如果洗漱的过程中人数大于等于k,baoge也是不能容忍的,所以必须保证他洗漱的m分钟内洗漱人数始终小于k)。所以baoge求助于你们,已知19楼有n个人,告诉你每个人的洗漱时间。按照baoge的洗漱规则,判断baoge今天是否能洗漱成功。
Input
输入T代表有T组测试数据 对于每组数据,第一行输入三个数,n,m,k(1<=n<=100,1<=m<=360,1<=k<=100).分别代表19楼人数,baoge洗漱时间,baoge洗漱的人数限制。 接下来一行输入一个时间段表示baoge洗漱的限定时间段(6:00-12:00之间)。 接下来n行,每行一个时间段,代表其他人的洗漱时间段(6:00-12:00之间)。
Output
对于每组数据,如果baoge能洗漱完,则输出”:)”(没有双引号),否则输出”Zzzzzz”。
Sample Input
2 5 30 3 8:00-9:00 8:29-9:30 9:30-10:30 10:30-11:30 8:00-8:30 8:29-9:45 5 10 5 6:10-6:20 6:10-6:20 6:10-6:20 6:10-6:20 6:10-6:20 6:10-6:20
Sample Output
:) Zzzzzz
Hint
对于样例1,baoge的洗漱时间段是8:00-9:00,只有8:29和8:30有3个人洗漱,所以baoge可以在8:31-9:00完成洗漱。 样例2,在6:10-6:20有5个人,所以不能洗漱。 对于时间段的输入可以采用scanf(“%d:%d-%d:%d”,&h1,&m1,&h2,&m2)。
#include <stdio.h> #include <string.h> //很自然的想到使用数组来处理。因为总的时间段就6个小时,按照分钟划分 //也就是说6*60的数组就够用了; #define N 1000 int time[N]; int Time(int hour,int fen) {return (hour-6)*60+fen; } int main() {int a,b,a1,b1;int i,j,k,n,m,T;scanf("%d",&T);while(T--){for(i=0;i<1000;i++)time[i]=0;scanf("%d %d %d",&n,&m,&k);scanf("%d:%d-%d:%d",&a,&b,&a1,&b1);for(i=0;i<n;i++){char str[20];int hour,fen,hour1,fen1;scanf("%d:%d-%d:%d",&hour,&fen,&hour1,&fen1);/*scanf("%s",str);sscanf(&str[0],"%d",&hour);sscanf(&str[2],"%d",&fen);sscanf(&str[5],"%d",&hour1);sscanf(&str[7],"%d",&fen1);*/int time1=Time(hour,fen);int time2=Time(hour1,fen1);for(j=time1;j<=time2;j++)time[j]++;}int flag=1;int aa,bb;aa=Time(a,b);bb=Time(a1,b1);for(i=aa;i<=bb-m+1;i++){int flag=1;for(j=i;j<i+m;j++){if(j>bb){flag=0;break;}if(time[j]<k) continue;else{flag=0;break;}}if(flag) break;}if(i<=(bb-m+1)) printf(":)\n");else printf("Zzzzzz\n");}return 0; }