【作业向】程序设计思维与实践 Week14 限时大模拟

【作业向】程序设计思维与实践 Week14限时大模拟

A 猫睡觉问题

本题是一个关于时间区间的模拟题,要注意以下几个方面:

  • 将时间统一转换为分钟,便于计算
  • 将时间从24小时制改为48小时制,便于处理跨夜的问题
  • 在最后一个番后面插入(第一个番+24小时)
  • 在两个番的中间,能多长睡就睡多长
  • 得到了新的睡觉区间后立即和前一个睡觉区间的结尾作比较,但是否超过最长醒着的时间,若超过则立即中止
  • 判断睡觉区间是否等于0,若等于0,则输出no(因为猫可能这一天里可以不睡觉,但如果一直不睡,醒着的时间迟早会超过上限)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<utility>
using namespace std;
struct data
{
int s,e;
}fan[25],slep[25];
int n,ssum,flag,a,b;

int wly(data x,data y)
{
return x.s<y.s;
}

int main()
{
int i,j,k,h,l,sum;
while(scanf("%d%d%d",&a,&b,&n)!=EOF)
{
flag=0;
ssum=0;
a*=60,b*=60;
memset(fan,0,sizeof(fan));
memset(slep,0,sizeof(slep));
for(i=1;i<=n;i++)
{
scanf("%2d:%2d-%2d:%2d",&h,&j,&k,&l);
fan[i].s=h*60+j;fan[i].e=k*60+l;
if(fan[i].e<fan[i].s) fan[i].e+=1440;
}
sort(fan+1,fan+n+1,wly);
fan[n+1].s=fan[1].s+1440,fan[n+1].e=fan[1].e+1400;
for(i=1;i<=n;i++)
{
if(fan[i+1].s-fan[i].e-1>=a)
{
slep[++ssum].s=fan[i].e+1;
slep[ssum].e=fan[i+1].s-1;
if(ssum>1 && slep[ssum].s-slep[ssum-1].e-1>b)
{
flag=1;
break;
}
}
}
if(ssum>0 && slep[1].s+1440-slep[ssum].e-1>b) flag=1;
//printf("--%d--%d--",flag,ssum);
if(!flag && ssum)
{
printf("Yes\n%d\n",ssum);
for(i=1;i<=ssum;i++)
{
printf("%02d:%02d-%02d:%02d\n",(slep[i].s%1440)/60,(slep[i].s%1440)%60,(slep[i].e%1440)/60,(slep[i].e%1440)%60);
}
}
else printf("No\n");
}
return 0;
}
坚持原创技术分享,您的支持将鼓励我继续创作!