题解:P11002 [蓝桥杯 2024 省 Python B] 神奇闹钟

传送门

P11002 题解:

————————————

思路:

本篇题解为 c++ 不使用标准库函数题解。
此题的难度在于如何求出目标时间(即读入时间)于标注时间的天数,再将处理后的天数转化为具体天数。正在学模拟的可以试试。

  1. 首先用两个字符串读入读入时间截,再将字符时间截存入整型变量,便于以后使用。这部分的代码如下:
//转化
        cin>>s1>>s2>>x;
		int year=(s1[0]-'0')*1000+(s1[1]-'0')*100+(s1[2]-'0')*10+s1[3]-'0';
		int month=(s1[5]-'0')*10+(s1[6]-'0');
		int day=(s1[8]-'0')*10+(s1[9]-'0');
		int hour=(s2[0]-'0')*10+(s2[1]-'0');
		int minute=(s2[3]-'0')*10+(s2[4]-'0');
  1. 再将求出距离最近一次响铃过了多久。
    先时间截转化为天数。我们知道闰年一年有 \(366\) 天,平年一年有 \(365\) 天。可以从 \(1970\) 年枚举到目标年减一,遇到闰年天数加 \(366\),否则加 \(365\)。再枚举月,从 \(1\) 月枚举到目标月减一。注意我们仍要考虑闰年。代码思路和求年天数一样。最后再直接加上目标天减一。再将天数转化为分钟数,注意别忘了要加上目标时间的小时和分钟。再将求出距离最近一次响铃过了多久。如果设已过分钟数为 \(minutesum\),那么距离近一次响铃过的时间就为 \(minutesum \bmod x\)
//求天数
        long long daysum=0;
		for(int i=1970;i<year;i++){
			if(i%4==0&&(i%100!=0||i%400==0))daysum+=366;
			else daysum+=365;
		}
		for(int i=1;i<mouth;i++){
			if(year%4==0&&(year%100!=0||year%400==0)){
				if(i==2)daysum+=29;
				else daysum+=f[i];
			}
			else daysum+=f[i];
		}
		daysum+=day-1;
        daysum=daysum*24*60+hour*60+minute;//求分钟
        int daycnt=daysum%x;//求距离上一次响铃过的时间

4.注意 \(1 \le x \le 1000\),说明距离上一次响铃最多过了大约一天。我们便可以用时间截进行简单地倒推并输出了。分类讨论:

  • 如果上次响铃时间和目标时间在同一小时内。只需将目标时间的分钟减去 \(minutesum \bmod x\),其余直接输出即可。
  • 如果上次响铃时间和目标时间在同一天内。如果设目标时间的小时为 \(hour\) 小时,分钟为 \(minute\) 分钟。那么响铃的小时为 \(( hour \times 60 + minute - minutesum \bmod x)\div 60\),分钟为 \((hour \times 60 + minute - minutesum \bmod x) \bmod 60\)
  • 如果上次响铃时间和目标时间在第二天。注意特判时间,其余和情况 \(2\) 基本相同。

这部分代码为:

//输出,注意格式
            if(minute>=daycnt){
			cout<<s1<<" ";
			if(hour<10)cout<<'0'<<hour;
			else cout<<hour;
			cout<<':';
			if(minute-daycnt<10)cout<<'0'<<minute-daycnt;
			else cout<<minute-daycnt;
			cout<<':';
			cout<<"00";
		}
		else if(daycnt<=hour*60+minute){
			cout<<s1<<" ";
			if((hour*60+minute-daycnt)/60<10)cout<<'0'<<(hour*60+minute-daycnt)/60;
			else cout<<(hour*60+minute-daycnt)/60;
			cout<<':';
			if((hour*60+minute-daycnt)%60<10)cout<<'0'<<(hour*60+minute-daycnt)%60;
			else cout<<(hour*60+minute-daycnt)%60;
			cout<<':';
			cout<<"00";
		}
		else {
			if(day==1&&month==1)cout<<year-1<<'-'<<"12-31 ";
			else 
			{
				cout<<year<<'-';
				if(month<10)cout<<'0'<<month;
				else cout<<month;
				cout<<'-';
				if(day-1<10)cout<<'0'<<day-1;
				else cout<<day-1;
				cout<<" ";
			}
			if((24*60+hour*60+minute-daycnt)/60<10)cout<<'0'<<(24*60+hour*60+minute-daycnt)/60;
			else cout<<(24*60+hour*60+minute-daycnt)/60;
			cout<<':';
			if((24*60+hour*60+minute-daycnt)%60<10)cout<<'0'<<(24*60+hour*60+minute-daycnt)%60;
			else cout<<(24*60+hour*60+minute-daycnt)%60;
			cout<<':';
			cout<<"00";
		}
		cout<<endl;

完整代码:

#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int t,x;
int f[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main(){
	cin>>t;
	while(t--){
		cin>>s1>>s2>>x;
		int year=(s1[0]-'0')*1000+(s1[1]-'0')*100+(s1[2]-'0')*10+s1[3]-'0';
		int month=(s1[5]-'0')*10+(s1[6]-'0');
		int day=(s1[8]-'0')*10+(s1[9]-'0');
		int hour=(s2[0]-'0')*10+(s2[1]-'0');
		int minute=(s2[3]-'0')*10+(s2[4]-'0');
		long long daysum=0;
		for(int i=1970;i<year;i++){
			if(i%4==0&&(i%100!=0||i%400==0))daysum+=366;
			else daysum+=365;
		}
		for(int i=1;i<month;i++){
			if(year%4==0&&(year%100!=0||year%400==0)){
				if(i==2)daysum+=29;
				else daysum+=f[i];
			}
			else daysum+=f[i];
		}
		daysum+=day-1;
		long long minutesum=daysum*24*60+hour*60+minute;
		int daycnt=minutesum%x;
		if(minute>=daycnt){
			cout<<s1<<" ";
			if(hour<10)cout<<'0'<<hour;
			else cout<<hour;
			cout<<':';
			if(minute-daycnt<10)cout<<'0'<<minute-daycnt;
			else cout<<minute-daycnt;
			cout<<':';
			cout<<"00";
		}
		else if(daycnt<=hour*60+minute){
			cout<<s1<<" ";
			if((hour*60+minute-daycnt)/60<10)cout<<'0'<<(hour*60+minute-daycnt)/60;
			else cout<<(hour*60+minute-daycnt)/60;
			cout<<':';
			if((hour*60+minute-daycnt)%60<10)cout<<'0'<<(hour*60+minute-daycnt)%60;
			else cout<<(hour*60+minute-daycnt)%60;
			cout<<':';
			cout<<"00";
		}
		else {
			if(day==1&&month==1)cout<<year-1<<'-'<<"12-31 ";
			else 
			{
				cout<<year<<'-';
				if(month<10)cout<<'0'<<month;
				else cout<<month;
				cout<<'-';
				if(day-1<10)cout<<'0'<<day-1;
				else cout<<day-1;
				cout<<" ";
			}
			if((24*60+hour*60+minute-daycnt)/60<10)cout<<'0'<<(24*60+hour*60+minute-daycnt)/60;
			else cout<<(24*60+hour*60+minute-daycnt)/60;
			cout<<':';
			if((24*60+hour*60+minute-daycnt)%60<10)cout<<'0'<<(24*60+hour*60+minute-daycnt)%60;
			else cout<<(24*60+hour*60+minute-daycnt)%60;
			cout<<':';
			cout<<"00";
		}
		cout<<endl;
	}
	return 0;
}

posted @ 2025-07-26 18:47  WMWD  阅读(9)  评论(0)    收藏  举报