喵哈哈村的魔法考试 Round #7 (Div.2) C
喵哈哈村的Dva
发布时间: 2017年3月13日 12:01 时间限制: 1000ms 内存限制: 128M
为了拯救喵哈哈村,这个世界必须要存在英雄。
一名叫做Dva的英雄站了出来!她现在面临一个问题:
计算机系统中使用的UTC时间基于原子钟,这种计时方式同“地球自转一周是24小时”的计时方式有微小的偏差。为了弥补这种偏差,我们偶尔需要增加一个“闰秒”。
最近的一次闰秒增加发生在UTC时间2016年的最后一天。我们在2016年12月31日23时59分59秒和2017年1月1日0时0分0秒之间增加了这样一秒:2016年12月31日23时59分60秒,记作2016-12-31 23:59:60。
目前一共增加了27次闰秒,具体添加的时间见下表:
给出两个时间,请你判断在考虑闰秒的情况下,这两个时间间隔多少秒。
本题包含若干组测试数据。
两个时间各占一行,格式是yyyy-MM-dd HH:mm:ss,范围在1970-01-01 00:00:00至2017-03-12 23:59:59之间。保证第一个时间不晚于第二个时间。
两个时间间隔多少秒。
复制
2016-12-31 23:59:59 2017-01-01 00:00:00
2
刚看到这个题目的时候,脑子飘过一种想法,这tm怎么求啊 判断两个时间相差多少?从年开始?还要考虑是不是1.1号和12.31号这样的特殊的日子,那怎么做减法啊!!! 太难写啦!然后就放弃了...
然后看题解...噢 想起来这个求法类似于 s(i到t)=s(t)-s(i),就是求一段差值可以用长距离减去短距离,而不是直接相减,这样就可以减少计算量了!(还是自己脑子不够用啊...这个逻辑思维都转换不过来)
然后就是打表(特殊情况打表查询!!!),然后从年月日开始检查,注意几个小细节(判断2月的时候检查是否为闰年,判断六月的时候检查当年是否有六月闰秒,十二月不用检查, 注意一下年月日的枚举
从0到y-1, m-1, d-1)
1 #include<iostream> 2 #include<string> 3 #include<cstdio> 4 using namespace std; 5 string s1, s2, s3, s4; 6 int y1, m1, d1, h1, mi1, se1, y2, m2, d2, h2, mi2, se2; 7 int v1[50]={1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1987, 1989, 1990, 1995, 1998, 2005, 2008, 2016}; 8 int v2[50]={1972, 1981, 1982, 1983, 1985, 1992,1993, 1994, 1997, 2012, 2015}; 9 int mm[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 10 11 void getTime(){ 12 y1=0, m1=0, d1=0, h1=0, mi1=0, se1=0, y2=0, m2=0, d2=0, h2=0, mi2=0, se2=0; 13 for(int i=0; i<4; i++){ 14 y1=y1*10+(s1[i]-'0'); 15 y2=y2*10+(s3[i]-'0'); 16 } 17 for(int i=5; i<7; i++){ 18 m1=m1*10+(s1[i]-'0'); 19 m2=m2*10+(s3[i]-'0'); 20 } 21 for(int i=8; i<10; i++){ 22 d1=d1*10+(s1[i]-'0'); 23 d2=d2*10+(s3[i]-'0'); 24 } 25 for(int i=0; i<2; i++){ 26 h1=h1*10+(s2[i]-'0'); 27 h2=h2*10+(s4[i]-'0'); 28 } 29 for(int i=3; i<5; i++){ 30 mi1=mi1*10+(s2[i]-'0'); 31 mi2=mi2*10+(s4[i]-'0'); 32 } 33 for(int i=6; i<8; i++){ 34 se1=se1*10+(s2[i]-'0'); 35 se2=se2*10+(s4[i]-'0'); 36 } 37 } 38 bool check(int y){ 39 if(y%400==0) return 1; 40 if(y%4==0&&y%100!=0) return 1; 41 return 0; 42 } 43 int check2(int y){ 44 int tem=0; 45 for(int i=0; i<16; i++){ 46 if(v1[i]==y)tem++; 47 } 48 for(int i=0; i<11; i++) 49 if(v2[i]==y) tem++; 50 return tem; 51 } 52 bool check6(int y){ 53 for(int i=0; i<11; i++) 54 if(v2[i]==y) return 1; 55 return 0; 56 } 57 long long solve(int y, int m, int d, int h, int mi, int se){ 58 long long temp=0; 59 for(int i=1970; i<y; i++){ 60 if(check(i)) temp+=1ll*366*24*60*60; 61 else temp+=1ll*365*24*60*60; 62 temp+=check2(i); 63 } 64 for(int i=0; i<m-1; i++){ 65 if(i==1&&check(y)) temp+=1ll*29*24*60*60; 66 else temp+=1ll*mm[i]*24*60*60; 67 if(i==5&&check6(y)) temp+=1; 68 } 69 for(int i=0; i<d-1; i++){ 70 temp+=24*60*60; 71 } 72 for(int i=0; i<h; i++){ 73 temp+=60*60; 74 } 75 for(int i=0; i<mi; i++){ 76 temp+=60; 77 } 78 temp+=se; 79 return temp; 80 } 81 int main(){ 82 while(cin>>s1>>s2>>s3>>s4){ 83 getTime(); 84 long long tmp=-(solve(y1, m1, d1, h1, mi1, se1)-solve(y2, m2, d2, h2, mi2, se2)); 85 cout<<tmp<<endl; 86 } 87 return 0; 88 }