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