• 喵哈哈村的魔法考试 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 }
  • 相关阅读:
    Linux--VSFTP服务搭建
    Linux--Smba服务搭建
    Linux--DHCP搭建
    编程语言的分类
    用户,组及权限
    linux常用基本命令整理小结
    数据结构之顺序表实现
    进程管理之system
    进程管理之wait和waitpid
    进程管理之fork函数
  • 原文地址:https://www.cnblogs.com/ledoc/p/6556840.html
Copyright © 2020-2023  润新知