题目描述
题目要求计算在两个时间点之间完整包含的给定时间周期(年、月、日、时、分、秒)的数量。时间点由年月日时分秒组成(年份范围197019701970到203020302030,日期合法)。闰年规则:能被444整除但不能被100100100整除,或能被400400400整除的年份为闰年。
输入格式
输入包含多个数据块,每个数据块有三行:
- 第一行:666个整数,表示起始时间点D1D_1D1。
- 第二行:666个整数,表示结束时间点D2D_2D2(D1<D2D_1 < D_2D1<D2)。
- 第三行:一个整数和一个单词,表示周期长度和单位(
year、month、day、hour、minute、second)。
每个数据块后有一个空行。
输出格式
对于每个数据块,输出一行一个整数,表示D1D_1D1到D2D_2D2之间完整包含的周期数。
样例
输入
1997 12 31 23 59 59 1998 1 1 0 0 0 1 second 2000 2 29 0 0 0 2000 2 29 23 59 59 1 day 2000 2 29 0 0 0 2000 3 1 0 0 0 24 hour 1996 12 31 20 30 0 1997 1 1 7 30 0 60 minute 1996 12 31 20 30 0 1997 1 1 7 30 0 1 hour输出
1 0 1 11 10题目分析
本题的核心是计算两个时间点之间完整包含的周期数。需要根据单位分别计算,并考虑闰年和月份天数的变化。
计算方法
对于给定的起始时间D1D_1D1和结束时间D2D_2D2,计算从D1D_1D1的下一时刻到D2D_2D2的指定时间单位数量,然后除以周期长度。
具体实现:
- 对于年:计算D1D_1D1之后第一个整年的起始时刻,到D2D_2D2之前最后一个整年的结束时刻之间的整年数。
- 对于月:类似地计算整月数。
- 对于日、时、分、秒:将D1D_1D1的下一时刻到D2D_2D2的时刻之间的总秒数(或分钟、小时、天数)除以周期长度。
边界处理
- 起始时间点的当前单位不计入(例如,从
23:59:59到00:00:00的111秒区间包含111个完整秒)。 - 闰年影响二月的天数。
- 输出整数除法结果(向下取整)。
复杂度分析
每个数据块O(1)O(1)O(1)计算。
代码实现
// Time// UVa ID: 518// Verdict: Accepted// Submission Date: 2017-04-29// UVa Run Time: 0.010s//// 版权所有(C)2017,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;intyear1,month1,day1,hour1,minute1,second1;intyear2,month2,day2,hour2,minute2,second2;longlongperiod;string unit;intdaysInMonth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};boolisLeapYear(intyear){return(year%400==0)||(year%4==0&&year%100!=0);}longlonggetYears(){longlongyears=0;for(inti=year1+1;i<year2;i++)years++;returnyears;}longlonggetMonths(){longlongmonths=getYears()*12;if(year1!=year2){for(inti=month1+1;i<=12;i++)months++;for(inti=1;i<month2;i++)months++;}else{for(inti=month1+1;i<month2;i++)months++;}returnmonths;}longlonggetDays(){longlongdays=0;for(inti=year1+1;i<year2;i++)days+=(isLeapYear(i)?366:365);intstart=day1+1;if(hour1==0&&minute1==0&&second1==0)start=day1;if(year1!=year2){for(inti=month1+1;i<13;i++){if(i==2)days+=(isLeapYear(year1)?29:28);elsedays+=daysInMonth[i];}for(inti=1;i<month2;i++){if(i==2)days+=(isLeapYear(year2)?29:28);elsedays+=daysInMonth[i];}}else{for(inti=month1+1;i<month2;i++){if(i==2)days+=(isLeapYear(year1)?29:28);elsedays+=daysInMonth[i];}}if(year1!=year2||month1!=month2){inttotalDays=0;if(month1==2)totalDays=(isLeapYear(year1)?29:28);elsetotalDays=daysInMonth[month1];for(inti=start;i<=totalDays;i++)days++;for(inti=1;i<day2;i++)days++;}else{for(inti=start;i<day2;i++)days++;}returndays;}longlonggetHours(){longlonghours=getDays()*24;intstart=hour1+1;if(minute1==0&&second1==0)start=hour1;if(year1!=year2||month1!=month2||day1!=day2){if(hour1!=0||minute1!=0||second1!=0)for(inti=start;i<24;i++)hours++;for(inti=0;i<hour2;i++)hours++;}else{for(inti=start;i<hour2;i++)hours++;}returnhours;}longlonggetMinutes(){longlongminutes=getHours()*60;intstart=minute1+1;if(second1==0)start=minute1;if(year1!=year2||month1!=month2||day1!=day2||hour1!=hour2){if(minute1!=0||second1!=0)for(inti=start;i<60;i++)minutes++;for(inti=0;i<minute2;i++)minutes++;}else{for(inti=start;i<minute2;i++)minutes++;}returnminutes;}longlonggetSeconds(){longlongseconds=getMinutes()*60;if(year1!=year2||month1!=month2||day1!=day2||hour1!=hour2||minute1!=minute2){if(second1!=0)for(inti=second1;i<60;i++)seconds++;for(inti=0;i<second2;i++)seconds++;}else{for(inti=second1;i<second2;i++)seconds++;}returnseconds;}intmain(intargc,char*argv[]){cin.tie(0),cout.tie(0),ios::sync_with_stdio(false);while(cin>>year1){cin>>month1>>day1>>hour1>>minute1>>second1;cin>>year2>>month2>>day2>>hour2>>minute2>>second2;cin>>period>>unit;if(unit=="year")cout<<(getYears()/period);if(unit=="month")cout<<(getMonths()/period);if(unit=="day")cout<<(getDays()/period);if(unit=="hour")cout<<(getHours()/period);if(unit=="minute")cout<<(getMinutes()/period);if(unit=="second")cout<<(getSeconds()/period);cout<<'\n';}return0;}