程序设计思维与实践 Week14 限时大模拟 (3/4/数据班)
A - 猫睡觉问题
将番的开始时间与结束时间以距零点的分钟数进行记录。
记录持续醒着的时间段,若大于60则停止循环,输出No,否则遍历每个时间段,若空闲时间大于60,则这段时间用于睡觉,并更新last的起始时间与结束时间,若小于a60则不能睡觉,仅更新last的结束时间,last结束时间更新为当前播出时间的的结束时间。
考虑最后一个时间段与第二天的第一个时间段之间的空闲时间。若不能用于睡觉,则当前清醒持续时间与我们在第一天考虑的第一段持续时间要长。
问题分析
遍历数字,输出不重复的数字的个数。
#include <bits/stdc++.h>
using namespace std;
const int size=20+10;
const int all=24*60;
int a,b,n;
struct Tim{
int be;
int en;
bool operator<(const Tim&b)
{
return be<b.be;
}
};
Tim be[size];
Tim ans[size];
int num;
void solve()
{
bool flag=true;
sort(be,be+n);
num=-1;
Tim last;
last.be=be[0].be;
last.en=be[0].en;
for(int i=1;i<n;i++)
{
if(last.en-last.be+1>b*60)
{
flag=false;break;
}
int temp=be[i].be-be[i-1].en-1;
if(temp>=a*60)
{
ans[++num].be=be[i-1].en+1;
ans[num].en=be[i].be-1;
last.be=be[i].be;last.en=be[i].en;
}
else
last.en=be[i].en;
}
if((last.en-last.be+1)>b*60)
flag=false;
if(flag)
{
if(be[0].be+all-last.en-1>=a*60)
{
ans[++num].be=(last.en+1)%all;
ans[num].en=(be[0].be-1+all)%all;
}
else if(num!=-1)
{
int temp=(ans[0].be-1+all)-last.be+1;
if(temp>b*60)flag=false;
}
}
if(!flag||num==-1)
printf("No
");
else
{
int h1,h2,m1,m2;
printf("Yes
");
printf("%d
",num+1);
for(int i=0;i<=num;i++)
{
h1=((ans[i].be%all)/60);
m1=ans[i].be%all%60;
h2=(ans[i].en%all)/60;
m2=ans[i].en%all%60;
printf("%02d:%02d-%02d:%02d
",h1,m1,h2,m2);
}
}
}
int main()
{
int h1,h2,m1,m2;
while(scanf("%d%d%d",&a,&b,&n)!=EOF)
{
for(int i=0;i<n;i++)
{
scanf("%d:%d-%d:%d",&h1,&m1,&h2,&m2);
be[i].be=h1*60+m1;
be[i].en=h2*60+m2;
if(be[i].en<be[i].be)be[i].en+=all;
}
solve();
}
return 0;
}