喵哈哈村的Dva
为了拯救喵哈哈村,这个世界必须要存在英雄。
一名叫做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
题解
这道题实际上是模拟题,考虑的情况有点多。
我这里给一个我的做法:
手写一个cal()函数,表示1970年到这一天需要多少秒,然后两者相减,就是中间的答案。
然后就是讨论+特判了……
#include<bits/stdc++.h>
using namespace std;
string s1,s2,s3,s4;
int YYYY1,m1,d1,h1,f1,mi1,y2,m2,d2,h2,f2,mi2;
int V1[50]={1972,1973,1974,1975,1976,1977,1978,1979,1987,1989,1990,1995,1998,2005,2008,2016};//16
int V2[50]={1972,1981,1982,1983,1985,1992,1993,1994,1997,2012,2015};//11
int M[12]={31,28,31,30,31,30,31,31,30,31,30,31};
void gettime(){
YYYY1=0,m1=0,d1=0,h1=0,f1=0,mi1=0,y2=0,m2=0,d2=0,h2=0,f2=0,mi2=0;
for(int i=0;i<4;i++){
YYYY1=YYYY1*10+(s1[i]-'0');
y2=y2*10+(s3[i]-'0');
}
for(int i=5;i<7;i++){
m1=m1*10+(s1[i]-'0');
m2=m2*10+(s3[i]-'0');
}
for(int i=8;i<10;i++){
d1=d1*10+(s1[i]-'0');
d2=d2*10+(s3[i]-'0');
}
for(int i=0;i<2;i++){
h1=h1*10+(s2[i]-'0');
h2=h2*10+(s4[i]-'0');
}
for(int i=3;i<5;i++){
f1=f1*10+(s2[i]-'0');
f2=f2*10+(s4[i]-'0');
}
for(int i=6;i<8;i++){
mi1=mi1*10+(s2[i]-'0');
mi2=mi2*10+(s4[i]-'0');
}
}
bool check(int p)
{
if(p%400==0)return 1;
if(p%4==0&&p%100!=0)return 1;
return 0;
}
int check2(int y){
int tmp = 0;
for(int i=0;i<16;i++)
if(V1[i]==y)tmp++;
for(int i=0;i<11;i++)
if(V2[i]==y)tmp++;
return tmp;
}
int check6(int y){
for(int i=0;i<11;i++)
if(V2[i]==y)return 1;
return 0;
}
int check12(int y){
for(int i=0;i<16;i++)
if(V1[i]==y)return 1;
return 0;
}
long long solve(int y,int m,int d,int h,int f,int mi){
long long tmp = 0;
for(int i=1970;i<y;i++){
if(check(i))tmp+=1ll*366*24*60*60;
else tmp+=1ll*365*24*60*60;
tmp+=check2(i);
}
for(int j=0;j<m-1;j++){
if(j==1&&check(y))tmp+=1ll*29*24*60*60;
else tmp+=1ll*M[j]*24*60*60;
if(j==5&&check6(y))tmp++;
}
for(int k=0;k<d-1;k++){
tmp+=24*60*60;
}
for(int i=0;i<h;i++){
tmp+=60*60;
}