喵哈哈村的魔法考试 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次闰秒,具体添加的时间见下表:

QQ截图20170313115231.jpg

给出两个时间,请你判断在考虑闰秒的情况下,这两个时间间隔多少秒。

本题包含若干组测试数据。
两个时间各占一行,格式是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 }
原文地址:https://www.cnblogs.com/ledoc/p/6556840.html