Live2D //博客园自带,可加可不加

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

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
题解

这道题实际上是模拟题,考虑的情况有点多。

我这里给一个我的做法:

手写一个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;
    }
    for(int i=0;i<f;i++)
        tmp+=60;
    tmp+=mi;
    return tmp;
}
int main(){
    while(cin>>s1>>s2>>s3>>s4){
        gettime();
        long long ans=solve(y2,m2,d2,h2,f2,mi2)-solve(YYYY1,m1,d1,h1,f1,mi1);
        cout<<ans<<endl;
    }
}
 
posted @ 2017-03-16 12:21  wym1111  阅读(191)  评论(0编辑  收藏  举报
Live2D //博客园自带,可加可不加