题目描述题目要求计算在两个时间点之间完整包含的给定时间周期年、月、日、时、分、秒的数量。时间点由年月日时分秒组成年份范围197019701970到203020302030日期合法。闰年规则能被444整除但不能被100100100整除或能被400400400整除的年份为闰年。输入格式输入包含多个数据块每个数据块有三行第一行666个整数表示起始时间点D1D_1D1。第二行666个整数表示结束时间点D2D_2D2D1D2D_1 D_2D1D2。第三行一个整数和一个单词表示周期长度和单位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//// 版权所有C2017邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;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%4000)||(year%40year%100!0);}longlonggetYears(){longlongyears0;for(intiyear11;iyear2;i)years;returnyears;}longlonggetMonths(){longlongmonthsgetYears()*12;if(year1!year2){for(intimonth11;i12;i)months;for(inti1;imonth2;i)months;}else{for(intimonth11;imonth2;i)months;}returnmonths;}longlonggetDays(){longlongdays0;for(intiyear11;iyear2;i)days(isLeapYear(i)?366:365);intstartday11;if(hour10minute10second10)startday1;if(year1!year2){for(intimonth11;i13;i){if(i2)days(isLeapYear(year1)?29:28);elsedaysdaysInMonth[i];}for(inti1;imonth2;i){if(i2)days(isLeapYear(year2)?29:28);elsedaysdaysInMonth[i];}}else{for(intimonth11;imonth2;i){if(i2)days(isLeapYear(year1)?29:28);elsedaysdaysInMonth[i];}}if(year1!year2||month1!month2){inttotalDays0;if(month12)totalDays(isLeapYear(year1)?29:28);elsetotalDaysdaysInMonth[month1];for(intistart;itotalDays;i)days;for(inti1;iday2;i)days;}else{for(intistart;iday2;i)days;}returndays;}longlonggetHours(){longlonghoursgetDays()*24;intstarthour11;if(minute10second10)starthour1;if(year1!year2||month1!month2||day1!day2){if(hour1!0||minute1!0||second1!0)for(intistart;i24;i)hours;for(inti0;ihour2;i)hours;}else{for(intistart;ihour2;i)hours;}returnhours;}longlonggetMinutes(){longlongminutesgetHours()*60;intstartminute11;if(second10)startminute1;if(year1!year2||month1!month2||day1!day2||hour1!hour2){if(minute1!0||second1!0)for(intistart;i60;i)minutes;for(inti0;iminute2;i)minutes;}else{for(intistart;iminute2;i)minutes;}returnminutes;}longlonggetSeconds(){longlongsecondsgetMinutes()*60;if(year1!year2||month1!month2||day1!day2||hour1!hour2||minute1!minute2){if(second1!0)for(intisecond1;i60;i)seconds;for(inti0;isecond2;i)seconds;}else{for(intisecond1;isecond2;i)seconds;}returnseconds;}intmain(intargc,char*argv[]){cin.tie(0),cout.tie(0),ios::sync_with_stdio(false);while(cinyear1){cinmonth1day1hour1minute1second1;cinyear2month2day2hour2minute2second2;cinperiodunit;if(unityear)cout(getYears()/period);if(unitmonth)cout(getMonths()/period);if(unitday)cout(getDays()/period);if(unithour)cout(getHours()/period);if(unitminute)cout(getMinutes()/period);if(unitsecond)cout(getSeconds()/period);cout\n;}return0;}
UVa 518 Time
题目描述题目要求计算在两个时间点之间完整包含的给定时间周期年、月、日、时、分、秒的数量。时间点由年月日时分秒组成年份范围197019701970到203020302030日期合法。闰年规则能被444整除但不能被100100100整除或能被400400400整除的年份为闰年。输入格式输入包含多个数据块每个数据块有三行第一行666个整数表示起始时间点D1D_1D1。第二行666个整数表示结束时间点D2D_2D2D1D2D_1 D_2D1D2。第三行一个整数和一个单词表示周期长度和单位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//// 版权所有C2017邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;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%4000)||(year%40year%100!0);}longlonggetYears(){longlongyears0;for(intiyear11;iyear2;i)years;returnyears;}longlonggetMonths(){longlongmonthsgetYears()*12;if(year1!year2){for(intimonth11;i12;i)months;for(inti1;imonth2;i)months;}else{for(intimonth11;imonth2;i)months;}returnmonths;}longlonggetDays(){longlongdays0;for(intiyear11;iyear2;i)days(isLeapYear(i)?366:365);intstartday11;if(hour10minute10second10)startday1;if(year1!year2){for(intimonth11;i13;i){if(i2)days(isLeapYear(year1)?29:28);elsedaysdaysInMonth[i];}for(inti1;imonth2;i){if(i2)days(isLeapYear(year2)?29:28);elsedaysdaysInMonth[i];}}else{for(intimonth11;imonth2;i){if(i2)days(isLeapYear(year1)?29:28);elsedaysdaysInMonth[i];}}if(year1!year2||month1!month2){inttotalDays0;if(month12)totalDays(isLeapYear(year1)?29:28);elsetotalDaysdaysInMonth[month1];for(intistart;itotalDays;i)days;for(inti1;iday2;i)days;}else{for(intistart;iday2;i)days;}returndays;}longlonggetHours(){longlonghoursgetDays()*24;intstarthour11;if(minute10second10)starthour1;if(year1!year2||month1!month2||day1!day2){if(hour1!0||minute1!0||second1!0)for(intistart;i24;i)hours;for(inti0;ihour2;i)hours;}else{for(intistart;ihour2;i)hours;}returnhours;}longlonggetMinutes(){longlongminutesgetHours()*60;intstartminute11;if(second10)startminute1;if(year1!year2||month1!month2||day1!day2||hour1!hour2){if(minute1!0||second1!0)for(intistart;i60;i)minutes;for(inti0;iminute2;i)minutes;}else{for(intistart;iminute2;i)minutes;}returnminutes;}longlonggetSeconds(){longlongsecondsgetMinutes()*60;if(year1!year2||month1!month2||day1!day2||hour1!hour2||minute1!minute2){if(second1!0)for(intisecond1;i60;i)seconds;for(inti0;isecond2;i)seconds;}else{for(intisecond1;isecond2;i)seconds;}returnseconds;}intmain(intargc,char*argv[]){cin.tie(0),cout.tie(0),ios::sync_with_stdio(false);while(cinyear1){cinmonth1day1hour1minute1second1;cinyear2month2day2hour2minute2second2;cinperiodunit;if(unityear)cout(getYears()/period);if(unitmonth)cout(getMonths()/period);if(unitday)cout(getDays()/period);if(unithour)cout(getHours()/period);if(unitminute)cout(getMinutes()/period);if(unitsecond)cout(getSeconds()/period);cout\n;}return0;}