B - 签到题

Posted lqx0123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了B - 签到题相关的知识,希望对你有一定的参考价值。

计算机系统中使用的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次闰秒,具体添加的时间见下表:

技术分享图片

 

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

Input

两个时间各占一行,格式是yyyy-MM-dd HH:mm:ss,范围在1970-01-01 00:00:00至2017-03-12 23:59:59之间。保证第一个时间不晚于第二个时间。

Output

两个时间间隔多少秒。

Sample Input

2016-12-31 23:59:59 
2017-01-01 00:00:00

Sample Output

2

实验代码

#include<stdio.h>
#include<string.h>
#include<stdbool.h>
#include<math.h>
typedef long long ll;
ll ans[5];
int Y[15]= {0,31,28,31,30,31,30,31,31,30,31,30,31}; //nor
char c[3][3][33]; // 0 y-m-d  1 h-mi-s
int y[5],m[5],d[5],h[5],mi[5],s[5];
int data[3000][5];
bool runnian(int a)
{
    if((a%4==0&&a%100!=0)||a%400==0) return 1;
    else return 0;
}
void debug()
{
    printf("%d %d %d**
",y[1],m[1],d[1]);
    printf("%d %d %d
",h[1],mi[1],s[1]);
    printf("%d %d %d
",y[2],m[2],d[2]);
    printf("%d %d %d
",h[2],mi[2],s[2]);
}
void init()
{
    memset(ans,0,sizeof(ans));
    memset(y,0,sizeof(y));
    memset(m,0,sizeof(m));
    memset(d,0,sizeof(d));
    memset(h,0,sizeof(h));
    memset(mi,0,sizeof(mi));
    memset(s,0,sizeof(s));
    data[1972][1]=1;
    data[1972][2]=1;
    for(int i=1973; i<=1979; i++) data[i][2]=1;
    for(int i=1981; i<=1983; i++) data[i][1]=1;
    data[1985][1]=1;
    data[1987][2]=1;
    data[1989][2]=1;
    data[1990][2]=1;
    for(int i=1992; i<=1994; i++) data[i][1]=1;
    data[1995][2]=1;
    data[1997][1]=1;
    data[1998][2]=1;
    data[2005][2]=1;
    data[2008][2]=1;
    data[2012][1]=1;
    data[2015][1]=1;
    data[2016][2]=1;
}

ll ansy=365*24*3600;
ll calnian(int y)
{
    ll ans=0;
    for(int i=1970; i<=y; i++) //年
    {
        ans+=ansy;
        if(runnian(i)) ans+=24*60*60;
        if(data[i][1]) ans++;
        if(data[i][2]) ans++;
    }
    return ans;
}

ll calyue(int y,int m)
{
    ll ans=0;
    for(int j=1; j<=m; j++) //月
    {
        ans+=Y[j]*24*60*60;
        if(j==2&&runnian(y)) ans+=24*60*60; //闰年2月+一天
        if(j==6&&data[y][1]) ans++;//闰秒也要
        if(j==12&&data[y][2]) ans++;
    }
    return ans;
}

ll calday(int y,int m,int d)
{
    int f=0;
    ll ans=0;
    if(runnian(y)&&m==2) ans+=24*3600;
    ans+=d*24*3600;
    if(m==6&&data[y][1]) ans++;
    return ans;
}

int main()
{
    init();
    for(int i=1; i<=2; i++)
        scanf("%d-%d-%d %d:%d:%d",&y[i],&m[i],&d[i],&h[i],&mi[i],&s[i]);
        //debug();
    for(int x=1; x<=2; x++)
    {
        ans[x]+=calnian(y[x]-1);
        ans[x]+=calyue(y[x],m[x]-1);
        ans[x]+=calday(y[x],m[x],d[x]-1);
        ans[x]+=h[x]*3600;
        ans[x]+=mi[x]*60;
        ans[x]+=s[x];
    }
    printf("%lld
",ans[2]-ans[1]);
    return 0;
}

  

设计思路

此代码我经过借鉴,自己乱改了一下,没想到过了(原本的代码

这道题我搞了半天发现还是不会做,于是就去找度娘,找了好多种代码,没一个能过。后来我就随便拿一个大佬代码,自己乱改一波,居然过了。哈哈哈~~

 

看到这个代码,发现好多知识点都不知道,我觉得我还是先去看书吧,丰富一下知识点。这题目~~唉,跟其他大佬的一波风算了...

以上是关于B - 签到题的主要内容,如果未能解决你的问题,请参考以下文章

2022牛客寒假算法基础集训营6 签到题5题(附基础集训营4-6签到题总结)

2022牛客寒假算法基础集训营6 签到题5题(附基础集训营4-6签到题总结)

lzoi模拟赛题解

2022牛客寒假算法基础集训营3 签到题7题(附基础集训营1-3签到题总结)

2022牛客寒假算法基础集训营3 签到题7题(附基础集训营1-3签到题总结)

第十二届蓝桥杯大赛软件赛省赛第二场C++B组