程序设计思维与实践 Week14 限时大模拟 (3/4/数据班)

程序设计思维与实践 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;
}
原文地址:https://www.cnblogs.com/master-cn/p/13052652.html