地址: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
思路:没啥好说的,大模拟!见代码吧!#include <bits/stdc++.h> using namespace std; #define PB insert
typedef long long LL;
typedef pair<int,int> PII;
const double eps=1e-;
const double pi=acos(-1.0);
const int K=1e6+;
const int mod=1e9+; struct Time
{
int y,m,d,h,mi,s;
void read(void)
{
scanf("%d-%d-%d %d:%d:%d",&y,&m,&d,&h,&mi,&s);
}
}st,se;
set<int>six,dece;
int day[]={,,,,,,,,,,,,};
void init(void)
{
st.read(),se.read();
six.PB(),six.PB(),six.PB(),six.PB();
six.PB(),six.PB(),six.PB(),six.PB();
six.PB(),six.PB(),six.PB();
dece.PB(),dece.PB(),dece.PB(),dece.PB();
dece.PB(),dece.PB(),dece.PB(),dece.PB();
dece.PB(),dece.PB(),dece.PB(),dece.PB();
dece.PB(),dece.PB(),dece.PB(),dece.PB();
}
bool check(int x)
{
return (x%==&&x%!=)||x%==;
}
int cal(Time &x)
{
int ans=;
for(int i=;i<x.m;i++)
ans+=day[i]***;
if(check(x.y)&&<x.m) ans+=**;
ans+=(x.d-)***;
ans+=x.h**;
ans+=x.mi*;
ans+=x.s;
if(six.find(x.y)!=six.end()&&<x.m)ans++;
return ans;
}
int main(void)
{
int ta,tb,ans=;
ta=***;
tb=***;
init();
for(int i=st.y;i<se.y;i++)
{
if(check(i)) ans+=tb;
else ans+=ta;
if(six.find(i)!=six.end()) ans++;
if(dece.find(i)!=dece.end()) ans++;
}
ans-=cal(st);
ans+=cal(se);
cout<<ans<<endl;
return ;
}