地址:http://hihocoder.com/problemset/problem/1477
题目:
闰秒
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
计算机系统中使用的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次闰秒,具体添加的时间见下表:
给出两个时间,请你判断在考虑闰秒的情况下,这两个时间间隔多少秒。
输入
两个时间各占一行,格式是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
思路:没啥好说的,大模拟!见代码吧!1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 #define PB insert 6 typedef long long LL; 7 typedef pair<int,int> PII; 8 const double eps=1e-8; 9 const double pi=acos(-1.0); 10 const int K=1e6+7; 11 const int mod=1e9+7; 12 13 struct Time 14 { 15 int y,m,d,h,mi,s; 16 void read(void) 17 { 18 scanf("%d-%d-%d %d:%d:%d",&y,&m,&d,&h,&mi,&s); 19 } 20 }st,se; 21 set<int>six,dece; 22 int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; 23 void init(void) 24 { 25 st.read(),se.read(); 26 six.PB(1972),six.PB(1981),six.PB(1982),six.PB(1983); 27 six.PB(1985),six.PB(1992),six.PB(1993),six.PB(1994); 28 six.PB(1997),six.PB(2012),six.PB(2015); 29 dece.PB(1972),dece.PB(1973),dece.PB(1974),dece.PB(1975); 30 dece.PB(1976),dece.PB(1977),dece.PB(1978),dece.PB(1979); 31 dece.PB(1987),dece.PB(1989),dece.PB(1990),dece.PB(1995); 32 dece.PB(1998),dece.PB(2005),dece.PB(2008),dece.PB(2016); 33 } 34 bool check(int x) 35 { 36 return (x%4==0&&x%100!=0)||x%400==0; 37 } 38 int cal(Time &x) 39 { 40 int ans=0; 41 for(int i=1;i<x.m;i++) 42 ans+=day[i]*24*60*60; 43 if(check(x.y)&&2<x.m) ans+=24*60*60; 44 ans+=(x.d-1)*24*60*60; 45 ans+=x.h*60*60; 46 ans+=x.mi*60; 47 ans+=x.s; 48 if(six.find(x.y)!=six.end()&&6<x.m)ans++; 49 return ans; 50 } 51 int main(void) 52 { 53 int ta,tb,ans=0; 54 ta=365*24*60*60; 55 tb=366*24*60*60; 56 init(); 57 for(int i=st.y;i<se.y;i++) 58 { 59 if(check(i)) ans+=tb; 60 else ans+=ta; 61 if(six.find(i)!=six.end()) ans++; 62 if(dece.find(i)!=dece.end()) ans++; 63 } 64 ans-=cal(st); 65 ans+=cal(se); 66 cout<<ans<<endl; 67 return 0; 68 }