题解:P14497 [NCPC 2025] Crochet Competition

· · 题解

题目传送门

题解

对于这类日期、时间大模拟,有经验的的人都知道一定要把每个时间转化成一个统一单位的时间,一般由题目决定。比如这道题,最小的时间单位是分钟,我们就要把开始和结束时间转化为以分钟为单位的时间进行计算。尽量不要直接用纯判断来写,细节太多你不要问我是怎么知道的。

转化成分钟后,记录两个时间的分钟差,依次用分钟差除以一天的分钟、一小时的分钟和一分钟,每次除完取余,就得到了相差的天数、小时数和分钟数。这里还要说明几个坑点:

  1. 结束时间不一定大于开始时间,如果小于,就说明时间跨越了一周,要分开计算。
  2. 结果的输出要注意单复数,还有注意若一个时间答案为0(比如零天),不能输出这个答案,输出有效答案的数量还和答案间的连接符有关。

剩下的细节详见代码。

Code

#include <bits/stdc++.h>
using namespace std;
string a1,a2,b1,b2;
int en=7*24*60,a,b,d,h,m,flag=3;
int day(string s){
    if(s=="Mon") return 0;
    if(s=="Tue") return 1*24*60;
    if(s=="Wed") return 2*24*60;
    if(s=="Thu") return 3*24*60;
    if(s=="Fri") return 4*24*60;
    if(s=="Sat") return 5*24*60;
    if(s=="Sun") return 6*24*60;
}
int ti(string s){
    int h=(s[1]-'0')+(s[0]-'0')*10;
    int m=(s[4]-'0')+(s[3]-'0')*10;
    return h*60+m;
}
int main(){
    cin >> a1 >> a2;
    cin >> b1 >> b2;
    a=day(a1)+ti(a2);
    b=day(b1)+ti(b2);
    if(b>=a) b-=a;
    else b=en-a+b;
    d=b/1440;
    if(d==0) flag--;//有效答案数--
    b%=1440;
    h=b/60;
    if(h==0) flag--;
    m=b%60;
    if(m==0) flag--;
    if(flag==0) cout << "7 days";//时间相等,说明刚好一周
    if(flag==1){
        if(d>0){
            if(d>1) cout << d << " days";
            else cout << d << " day";
        }
        if(h>0){
            if(h>1) cout << h << " hours";
            else cout << h << " hour";
        }
        if(m>0){
            if(m>1) cout << m << " minutes";
            else cout << m << " minute";
        }
    }
    if(flag==2){
        int f=0;
        if(d>0){
            if(d>1) cout << d << " days";
            else cout << d << " day";
            if(!f){//两个答案输出"and"连接,注意不要多输
                cout << " and ";
                f=1;
            }
        }
        if(h>0){
            if(h>1) cout << h << " hours";
            else cout << h << " hour";
            if(!f){
                cout << " and ";
                f=1;
            }
        }
        if(m>0){
            if(m>1) cout << m << " minutes";
            else cout << m << " minute";
        }
    }
    if(flag==3){
        if(d>0){
            if(d>1) cout << d << " days";
            else cout << d << " day";
        }
        cout << ", ";//全部用,连接
        if(h>0){
            if(h>1) cout << h << " hours";
            else cout << h << " hour";
        }
        cout << ", ";
        if(m>0){
            if(m>1) cout << m << " minutes";
            else cout << m << " minute";
        }
    }
    return 0;
}

又一道搞心态的模拟