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

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;
}

Guess you like

Origin blog.csdn.net/weixin_44080131/article/details/106562598