题解:P14497 [NCPC 2025] Crochet Competition

· · 题解

这是一道简单但麻烦的题。

思路

题太简单不想讲思路。
我们可以把时间处理一下,全部换算成分钟。
拿结束时间减去开始时间,有两种情况:

  1. 为正数,此时得数就是实际时间。
  2. 为负数或零,此时得数就是实际时间与一周的差(前者减后者)。这时再加上一周,就是实际时间。

好了,思路就是这样的。

细节

输入的是星期几的英文简写,所以我们可以用map<string,int>这个好东西。
它类似一维数组,但是下标是字符串

代码

#include<bits/stdc++.h>
using namespace std;
map<string,int>w;
int main() {
    w["Mon"]=1;w["Tue"]=2;w["Wed"]=3;w["Thu"]=4;w["Fri"]=5;w["Sat"]=6;w["Sun"]=7;
    string a,b;
    int d1,h1,m1,d2,h2,m2,d=0,h=0,m=0;//一定记得初始化
    cin>>a;
    scanf("%2d:%2d",&h1,&m1);
    cin>>b;
    scanf("%2d:%2d",&h2,&m2);
    d1=w[a],d2=w[b];
    int sum1=0,sum2=0,sum;//求时间
    sum1=(d1*24+h1)*60+m1;
    sum2=(d2*24+h2)*60+m2;
    sum=sum2-sum1;
    if(sum<=0)sum+=7*24*60;

    while(sum>=24*60)d++,sum-=24*60;//求答案
    while(sum>=60)h++,sum-=60;
    m=sum;
  //输出(没错,输出是最长的)
    int x;//部分的个数
    x=(d&&1)+(h&&1)+(m&&1);//非零数在做逻辑运算时视为1,且逻辑运算结果为真视为1,为假视为0,这样可以快速计算部分个数。
    if(x==1){
        if(d==1)cout<<"1 day";
        else if(d>1)cout<<d<<" days";
        if(h==1)cout<<"1 hour";
        else if(h>1)cout<<h<<" hours";
        if(m==1)cout<<"1 minute";
        else if(m>1)cout<<m<<" minutes";
    }
    if(x==2){
        if(d==1)cout<<"1 day and ";
        else if(d>1)cout<<d<<" days and ";
        if(h==1)cout<<"1 hour";
        else if(h>1)cout<<h<<" hours";
    if (h==0){
        if(m==1)cout<<"1 minute";
            else if(m>1)cout<<m<<" minutes";
    }
        else if(m==1)cout<<" and 1 minute";
        else if(m>1)cout<<" and "<<m<<" minutes";
    }
    if(x==3){
        if(d==1)cout<<"1 day, ";
        else if(d>1)cout<<d<<" days, ";
        if(h==1)cout<<"1 hour, ";
        else if(h>1)cout<<h<<" hours, ";
        if(m==1)cout<<"1 minute";
        else if(m>1)cout<<m<<" minutes";
    }
    //完结撒花!
}