zoukankan      html  css  js  c++  java
  • 喵哈哈村的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;
        }
    }
     
  • 相关阅读:
    LOJ 6192 城市网络(树上倍增)
    SDOI2010代码拍卖会 (计数类DP)
    失控的未来交通工具 (LOJ 508,带权并查集,数论)
    线段树维护区间前k小
    POJ 1966 Cable TV Network (最大流最小割)
    网络流学习笔记
    最大子矩阵和
    POJ 1723 Soldiers (中位数)
    最大子矩阵求法详解
    CH0805 防线 (二分值域,前缀和,特殊性质)
  • 原文地址:https://www.cnblogs.com/gfdybz/p/6558837.html
Copyright © 2011-2022 走看看