zoukankan      html  css  js  c++  java
  • week14-猫睡觉问题

    【猫睡觉问题】众所周知,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 不太一样,也可能是对的,它有一个判题程序来判定你的答案(当然,你对你自己的答案肯定也能肉眼判断)

    Sample Input

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

    Sample Output

    Yes
    1
    01:07-22:13
    No

    你尝试给喵喵喂小鱼干,它告诉了你一个秘密:“媌,吧唧吧唧小鱼…吧唧吧唧干香吧唧吧唧,媌,这题最麻烦吧唧吧唧…的吧唧吧唧是最后一个番到第二天第一个番期间时间段的处理哦,媌,但是吧唧吧唧可以有一种方法可以很容易处理吧唧吧唧吧唧。啊呀,我要去睡觉啦,媌”

    思路:

    模拟题:

    答案不唯一,我们输出容易输出的一种,休息时间最大 能睡就睡

    数据的处理:时间单位统一化,对于超过24:00的+24h

    时间差计算要 end-start+1

    我们只需要考虑完整一天  如果今天过了24:00+24任然按今天算,不对下一个产生影响。

     1 #include <iostream>
     2 #include <algorithm>
     3 #include<cstdio>
     4 using namespace std;
     5 const int maxn=25;
     6 const int total=24*60;
     7 int a,b,n;
     8 struct node{
     9     int begin;
    10     int end;
    11     bool operator<(node &b)
    12     {
    13         return begin<b.begin;
    14     }
    15 };
    16 node tt[maxn],res[maxn];   // timetable and resttime
    17 int num;
    18 void cal()
    19 {
    20     bool flag=true;
    21     sort(tt,tt+n);
    22     num=-1;
    23     node last;
    24     last.begin=tt[0].begin;
    25     last.end=tt[0].end;
    26     for(int i=1;i<n;i++)
    27     {
    28         if(last.end-last.begin+1>b*60)
    29         {
    30             flag=false;break;
    31         }
    32         int temp=tt[i].begin-tt[i-1].end-1;
    33         if(temp>=a*60)
    34         {
    35             res[++num].begin=tt[i-1].end+1;
    36             res[num].end=tt[i].begin-1;
    37             last.begin=tt[i].begin;last.end=tt[i].end;
    38         }
    39         else
    40             last.end=tt[i].end;
    41     }
    42     if((last.end-last.begin+1)>b*60)
    43         flag=false;
    44     if(flag)
    45     {
    46         if(tt[0].begin+total-last.end-1>=a*60)
    47         {
    48             res[++num].begin=(last.end+1)%total;
    49             res[num].end=(tt[0].begin-1+total)%total;
    50         }
    51         else if(num!=-1)
    52         {
    53             int temp=(res[0].begin-1+total)-last.begin+1;
    54             if(temp>b*60)flag=false;
    55         }
    56     }
    57     if(!flag||num==-1)
    58         printf("No
    ");
    59     else
    60     {
    61         int h1,h2,m1,m2;
    62         printf("Yes
    ");
    63         printf("%d
    ",num+1);
    64         for(int i=0;i<=num;i++)
    65         {
    66             h1=((res[i].begin%total)/60);
    67             m1=res[i].begin%total%60;
    68             h2=(res[i].end%total)/60;
    69             m2=res[i].end%total%60;
    70             printf("%02d:%02d-%02d:%02d
    ",h1,m1,h2,m2);
    71         }
    72     }
    73 }
    74 int main()
    75 {
    76     int h1,h2,m1,m2;
    77     while(scanf("%d%d%d",&a,&b,&n)!=EOF)
    78     {
    79         for(int i=0;i<n;i++)
    80         {
    81             scanf("%d:%d-%d:%d",&h1,&m1,&h2,&m2);
    82             tt[i].begin=h1*60+m1;
    83             tt[i].end=h2*60+m2;
    84             if(tt[i].end<tt[i].begin)tt[i].end+=total;
    85         }
    86         cal();
    87     }
    88     return 0;
    89 }
    View Code
  • 相关阅读:
    1024X768大图 (Wallpaper)
    (Mike Lynch)Application of linear weight neural networks to recognition of hand print characters
    瞬间模糊搜索1000万基本句型的语言算法
    单核与双核的竞争 INTEL P4 670对抗820
    FlashFTP工具的自动缓存服务器目录的功能
    LDAP over SSL (LDAPS) Certificate
    Restart the domain controller in Directory Services Restore Mode Remotely
    How do I install Active Directory on my Windows Server 2003 server?
    指针与指针变量(转)
    How to enable LDAP over SSL with a thirdparty certification authority
  • 原文地址:https://www.cnblogs.com/liuzhuan-xingyun/p/13053569.html
Copyright © 2011-2022 走看看