A - 猫睡觉问题
描述:
输入:
输出:
样例:
输入:
12 12 1
23:00-01:00
3 4 3
07:00-08:00
11:00-11:09
19:00-19:59
输出:
Yes
1
01:07-22:13
No
思想:
不保证输入新番时间表有序,起初没有看到这句话,导致在以为有序的情况下判断错误。这里我们统一将时间用分钟表示,时间结构体记录每一个时间段的开始和结束时间,开两个结构体数组,一个存放番剧时间一个存放睡觉时间。按结束时间对番剧时间数组进行排序;
遍历排序好的时间段,为了首尾相连令fan[N] = fan[0];计算两个番剧的时间间隔使用 ma = (t2 - t1 + 24 * 60) % (24 * 60)-1; 因为两个端点都包含在番剧之中,不算在间隔时间内,这里用-1;价格时间大于等于A可以睡觉。判断记录睡觉时间段记录在ans中。
如果没有睡觉,输出no,如果有睡觉,遍历睡觉时间段,睡觉时间段的间隔为清醒时间,判断有没有清醒时间段大于B,有则输出no,否则输出yes。注意这里计算时采取+1,因为记录ans时没有取端点。
代码:
/*
week 14限时模拟;
*/
#include<bits/stdc++.h>
using namespace std;
int A, B, N;
int ma,mb,t1,t2,cnt;
char tt;
struct time{
//时间结构体
int sh,sm, dh,dm;
bool operator<(const time&a)const
{
return dh * 60 + dm < a.dh * 60 + a.dm;
}
}fan[50],ans[50];
int main()
{
while (~scanf("%d%d%d",&A,&B,&N)){
int flag = 1;
cnt =mb=ma=0;
A*= 60;
B*= 60;
for (int i = 0; i < N;i++){
//输入时间段;
scanf("%d:%d-%d:%d", &fan[i].sh,&fan[i].sm,&fan[i].dh,&fan[i].dm);
}
sort(fan, fan + N);
fan[N] = fan[0];
for (int i = 0; i < N;i++){
t2 = fan[i+1].sh * 60 + fan[i+1].sm;
t1 = fan[i].dh * 60 + fan[i].dm;
ma = (t2 - t1 + 24 * 60) % (24 * 60)-1;
if(ma>=A){
//允许睡觉;
if (fan[i].dm==59){
ans[cnt].sh = (fan[i].dh+1)%24;
ans[cnt].sm = 0;
}
else{
ans[cnt].sh = fan[i].dh;
ans[cnt].sm = fan[i].dm + 1;
}
if (fan[i + 1].sm==0){
ans[cnt].dh = (fan[i + 1].sh-1+24)%24;
ans[cnt++].dm = 59;
}
else{
ans[cnt].dh = fan[i + 1].sh;
ans[cnt++].dm = fan[i + 1].sm-1;
}
}
}
//没有睡觉时间,一直清醒;
if(cnt==0){
//失败;
printf("No\n");
flag = 0;
}
ans[cnt] = ans[0];
if(flag)
for (int i = 0; i < cnt;i++){
t2 = ans[i+1].sh * 60 + ans[i+1].sm-1;
t1 = ans[i].dh * 60 + ans[i].dm+1;
mb = (t2 - t1 + 24 * 60) % (24 * 60)+1;
if(mb>B)
{
//清醒时间大于B;
printf("No\n");
flag = 0;
break;
}
}
if(flag){
printf("Yes\n%d\n", cnt);
for (int i = 0; i <cnt; i++){
printf("%02d:%02d-%02d:%02d\n", ans[i].sh, ans[i].sm, ans[i].dh, ans[i].dm);
}
}
}
return 0;
}