题解:P14497 [NCPC 2025] Crochet Competition
luoguzbh0011 · · 题解
这是一道简单但麻烦的题。
思路
题太简单不想讲思路。
我们可以把时间处理一下,全部换算成分钟。
拿结束时间减去开始时间,有两种情况:
- 为正数,此时得数就是实际时间。
- 为负数或零,此时得数就是实际时间与一周的差(前者减后者)。这时再加上一周,就是实际时间。
好了,思路就是这样的。
细节
输入的是星期几的英文简写,所以我们可以用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";
}
//完结撒花!
}