专栏文章

题解:P14497 [NCPC 2025] Crochet Competition

P14497题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@min7h5iz
此快照首次捕获于
2025/12/01 21:49
3 个月前
此快照最后确认于
2025/12/01 21:49
3 个月前
查看原文
这是一道简单但麻烦的题。

思路

题太简单不想讲思路。
我们可以把时间处理一下,全部换算成分钟。
拿结束时间减去开始时间,有两种情况:
  1. 为正数,此时得数就是实际时间。
  2. 为负数或零,此时得数就是实际时间与一周的差(前者减后者)。这时再加上一周,就是实际时间。
好了,思路就是这样的。

细节

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

代码

CPP
#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";
	}
	//完结撒花!
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...