题意

众所周知,TT家里有一只魔法喵。这只喵十分嗜睡。一睡就没有白天黑夜。喵喵一天可以睡多次!!每次想睡多久就睡多久╭(╯^╰)╮
喵睡觉的时段是连续的,即一旦喵喵开始睡觉了,就不能被打扰,不然喵会咬人哒[○・`Д´・ ○]
可以假设喵喵必须要睡眠连续不少于 A 个小时,即一旦喵喵开始睡觉了,至少连续 A 个小时内(即A*60分钟内)不能被打扰!
现在你知道喵喵很嗜睡了,它一天的时长都在吃、喝、拉、撒、睡,换句话说要么睡要么醒着滴!
众所周知,这只魔法喵很懒,和TT一样懒,它不能连续活动超过 B 个小时。
猫主子是不用工作不用写代码滴,十分舒适,所以,它是想睡就睡滴。
但是,现在猫主子有一件感兴趣的事,就是上BiliBili网站看的新番。
新番的播放时间它已经贴在床头啦(每天都用同一张时间表哦),这段时间它必须醒着!!
作为一只喵喵,它认为安排时间是很麻烦的事情,现在请你帮它安排睡觉的时间段。

Input

多组数据,多组数据,多组数据哦,每组数据的格式如下:
第1行输入三个整数,A 和 B 和 N (1 <= A <= 24, 1 <= B <= 24, 1 <= n <= 20)
第2到N+1行为每日的新番时间表,每行一个时间段,格式形如 hh:mm-hh:mm (闭区间),这是一种时间格式,hh:mm 的范围为 00:00 到 23:59。注意一下,时间段是保证不重叠的,但是可能出现跨夜的新番,即新番的开始时间点大于结束时间点。
保证每个时间段的开始时间点和结束时间点不一样,即不可能出现类似 08:00-08:00 这种的时间段。时长的计算由于是闭区间所以也是有点坑的,比如 12:00-13:59 的时长就是 120 分钟。
不保证输入的新番时间表有序。

Output

我们知道,时间管理是一项很难的活,所以你可能没有办法安排的那么好,使得这个时间段满足喵喵的要求,即每次睡必须时间连续且不少于 A 小时,每次醒必须时间连续且不大于 B 小时,还要能看完所有的番,所以输出的第一行是 Yes 或者 No,代表是否存在满足猫猫要求的时间管理办法。
然后,对于时间管理,你只要告诉喵喵,它什么时候睡觉即可。
即第2行输出一个整数 k,代表当天有多少个时间段要睡觉
接下来 k 行是喵喵的睡觉时间段,每行一个时间段,格式形如 hh:mm-hh:mm (闭区间),这个在前面也有定义。注意一下,如果喵喵的睡眠时段跨越当天到达了明天,比如从23点50分睡到0点40分,那就输出23:50-00:40,如果从今晚23:50睡到明天早上7:30,那就输出23:50-07:30。
输出要排序吗?(输出打乱是能过的,也就是说,题目对输出的那些时间段间的顺序是没有要求的)
哦对了,喵喵告诉你说,本题是 Special Judge,如果你的输出答案和 Sample 不太一样,也可能是对的,它有一个判题程序来判定你的答案(当然,你对你自己的答案肯定也能肉眼判断)

Example

Input
12 12 1
23:00-01:00
3 4 3
07:00-08:00
11:00-11:09
19:00-19:59

Output
Yes
1
01:07-22:13
No

思想

  • 将所有的时间跨度都用分钟数记录,并用函数minus_one_minite表示减去一分钟,函数add_one_minite表示加上一分钟
  • struct arrange表示时间区间
  • 在solve中,判断空闲时间是否可以睡觉,可以的话把时间区间记录在sle数组中,注意如果时间段跨天的话,要转为前一天的时间,并且在后一天的空闲时间和中要减去前一天跨天睡觉的时间,再去求空闲时间是否满足当天睡觉的要求时间,如此循环往复

注意坑!!!

  • 题目要求:
  • 每次睡必须时间连续且不少于 A 小时,每次醒必须时间连续且不大于 B 小时,还要能看完所有的番;每天都用同一张时间表,时间段是保证不重叠的,但是可能出现跨夜的新番。以上我们需要注意处理睡觉跨天和番跨天的特殊情况
  • 还有时长的计算由于是闭区间所以也是有点坑的,比如 12:00-13:59 的时长就是 120 分钟

代码

#include <iostream>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <algorithm>
using namespace std;
const int N=21;
int n,sleep,wake;
struct time
{int hour;int minite;int new_minite;void trans1(){ new_minite=hour*60+minite;}void trans2(){ new_minite+=24*60;}void minus_one_minite(){if(minite==0) {minite=59,hour--;}else minite--;if(hour<0)  hour+=24;}void add_one_minite(){if(minite==59){hour++,minite=0;}else minite++;if(hour>23) hour-=24;}bool operator <(const time a)const{   if(hour==a.hour){return minite<a.minite;}return hour<a.hour;       }
};struct arrange
{time tb,te;
} affire[N];int cmp(const void *a,const void *b)
{struct arrange *A=(arrange*)a;struct arrange *B=(arrange*)b;if(B->tb<A->tb)return 1;return -1;
}time sle[N][2];//sleep segment
char evn[20];void solve(bool flag)
{int i,j,begin,end,temp=0,nowlast=0,segn=0;time temp1,temp2;for(i=2;i<=n;i++){end=affire[i].tb.new_minite-1;begin=affire[i-1].te.new_minite+1;if(end<begin&&begin-end!=1)end+=24*60;if(end-begin+1>=sleep)//can sleep{++segn;temp1=affire[i-1].te;temp1.add_one_minite();sle[segn][0]=temp1;temp1=affire[i].tb;temp1.minus_one_minite();sle[segn][1]=temp1;nowlast=0;}else if(end-begin+1<sleep)//cannot sleep{if(nowlast==0)nowlast+=affire[i-1].te.new_minite-affire[i-1].tb.new_minite+1;nowlast+=affire[i].te.new_minite-affire[i-1].te.new_minite+1;if(nowlast>wake){printf("No\n");return ;}}}end=affire[1].tb.new_minite-1;begin=affire[n].te.new_minite+1;if(end<begin&&begin-end!=1)end+=24*60;if(end-begin+1>=sleep)//can sleep{++segn;temp2=affire[n].te;temp2.add_one_minite();sle[segn][0]=temp2;temp1=affire[1].tb;temp1.minus_one_minite();sle[segn][1]=temp1;nowlast=0;}else if(end-begin+1<sleep)//cannot sleep{if(nowlast==0)nowlast+=affire[n].te.new_minite-affire[n].tb.new_minite+1;nowlast+=affire[1].te.new_minite-affire[n].te.new_minite+1;if(nowlast>wake){printf("No\n");return ;}}if(n==0){segn=1;printf("Yes\n%d\n",segn);printf("00:00-23:59\n");return;}else{if(segn!=0){printf("Yes\n%d\n",segn);for(i=1;i<=segn;i++){printf("%02d:%02d-%02d:%02d\n",sle[i][0].hour,sle[i][0].minite,sle[i][1].hour,sle[i][1].minite);}}elseprintf("No\n");}
}
int main()
{while(scanf("%d%d",&sleep,&wake)!=EOF){sleep*=60,wake*=60;scanf("%d",&n);int i,j;bool flag=false;bool ss=false;for(i=1;i<=n;i++){time t1,t2;scanf("%d:%d-%d:%d",&t1.hour,&t1.minite,&t2.hour,&t2.minite);t1.trans1(),t2.trans1();if(t2.new_minite-t1.new_minite+1>wake){ss=true;}if(t2<t1){flag=true;t2.trans2();}affire[i].tb=t1;affire[i].te=t2;}if(ss){printf("No\n");continue;}qsort(affire+1,n,sizeof(time)*2,cmp);solve(flag);//flag->是否跨午夜}return 0;}

程序设计思维与实践 Week14 限时大模拟A - 猫睡觉问题相关推荐

  1. 程序设计思维与实践 Week14 限时大模拟

    文章目录 A - 猫睡觉问题 题目 思路 代码 A - 猫睡觉问题 题目 众所周知,TT家里有一只魔法喵.这只喵十分嗜睡.一睡就没有白天黑夜.喵喵一天可以睡多次!!每次想睡多久就睡多久╭(╯^╰)╮ ...

  2. 程序设计思维与实践 week10限时模拟 A - 签到题、B - 东东转魔方

    目录: A - 签到题 描述 输入 输出 样例 想法 代码 B - 东东转魔方 描述 输入 输出 样例 想法 代码 总结 A - 签到题 描述 东东有一个字符串X,该串包含偶数个字符,一半是 S 字符 ...

  3. 程序设计思维与实践 Week10限时模拟 东东的魔方

    问题描述 东东有一个二阶魔方,即2×2×2的一个立方体组.立方体由八个角组成. 魔方的每一块都用三维坐标(h, k, l)标记,其中h, k, l∈{0,1}.六个面的每一个都有四个小面,每个小面都有 ...

  4. 程序设计思维与实践 Week9 作业三道

    A - 咕咕东的目录管理器 题面 咕咕东的雪梨电脑的操作系统在上个月受到宇宙射线的影响,时不时发生故障,他受不了了,想要写一个高效易用零bug的操作系统 -- 这工程量太大了,所以他定了一个小目标,从 ...

  5. 山大程序设计思维与实践 六月模拟:猪国杀

    六月模拟:猪国杀 山东大学计算机科学与技术学院程序设计思维与实践作业 山大程序设计思维与实践 sdu程序设计思维与实践 山东大学程序设计思维实践作业H 山大程序设计思维实践作业H 山东大学程序设计思维 ...

  6. 山东大学计算机科学与技术学院程序设计思维与实践作业 week10-树型数据结构及其应用

    山东大学计算机科学与技术学院程序设计思维与实践作业 山大程序设计思维与实践作业 sdu程序设计思维与实践 山东大学程序设计思维实践作业H10 山大程序设计思维实践作业H10 山东大学程序设计思维与实践 ...

  7. 山东大学计算机科学与技术学院程序设计思维与实践作业 week5-数学基础与线性结构

    山东大学计算机科学与技术学院程序设计思维与实践作业 山大程序设计思维与实践作业 sdu程序设计思维与实践 山东大学程序设计思维实践作业H5 山大程序设计思维实践作业H5 山东大学程序设计思维与实践 w ...

  8. 山东大学程序设计思维与实践 四月模拟:TT与可怜的猫

    4月模拟-TT与可怜的猫 程序设计思维实践-复杂模拟题训练2 山东大学计算机科学与技术学院程序设计思维与实践 sdu程序设计思维与实践 山东大学程序设计思维实践作业 山大程序设计思维实践 山东大学程序 ...

  9. 作业Week9、10+月模拟题3、4+CSP3、4+限时大模拟10、14

    CSP3 A-瑞神的序列 1.题意:瑞神的数学一向是最好的,连强大的咕咕东都要拜倒在瑞神的数学水平之下,虽然咕咕东很苦 恼,但是咕咕东拿瑞神一点办法都没有. 5.1期间大家都出去玩了,只有瑞神还在孜孜 ...

最新文章

  1. ISME:基因组和转录组分析深海古菌Thermoprofundales
  2. 第二次作业--线性表
  3. Python+selenium自动化测试中Windows窗口跳转方法
  4. Android多线程研究(1)——线程基础及源码剖析
  5. nginx平滑升级make upgrade出错的解决办法
  6. css 大图保持宽高比压缩,css 保持宽高比缩放
  7. C++继承的继承方式
  8. 让linux的SSH客户端也能记住服务器的密码
  9. java解决导出word用wps打开正常,用office打开是html的标签的问题
  10. 微信开发博客——柳峰
  11. gho镜像安装器linux,Ghost镜像安装器
  12. Springboot整合SpringSecurity--对静态文件进行权限管理
  13. Pinczakko的AwardBIOS逆向工程指导
  14. 【复盘】目前实训三班级复盘遇到的问题
  15. 数字图像处理(冈萨雷斯)学习 第二章 数字图像基础
  16. 《ARM 嵌入式系统编程与优化》之 Linux/ARM 嵌入式平台
  17. 计算机无法获得有效ip地址,无法获取ip地址,详细教您电脑无法获取ip地址的解决方法...
  18. 【设计模式】-状态模式->APP抽奖活动(源码与类图解析)
  19. 朱小丹调研广东工业机器人产业有何深意?
  20. 国内cn域名过期失效日期计算方式

热门文章

  1. 二分法解具有单调性的方程
  2. 【运营宝典】华为分析服务如何助力广告投放策略优化?
  3. 初探强化学习(11)Dyna类型的强化学习
  4. 强化学习Reinforcement Learning概念理解篇(一)
  5. redis-----07-----redigo基本命令操作(主要讲如何让go的struct、map展开成redis的参数,以及使用struct获取redis返回的key-value批量数组)
  6. 插件目标[置顶] Maven自定义绑定
  7. ubuntu 16.04.7通过get-pip.py安装pip 20.3.4
  8. 如何在 JIRA 中创建自己的仪表板(Dashboard)
  9. .shtml网站解析UnicodeError
  10. 那些3年前转行做自媒体的站长,现在都怎样了?