到天宫做客
题目描述
有一天,我做了个梦,梦见我很荣幸的接到了猪八戒的邀请,到天宫陪他吃酒。我犹豫了。天上一日,人间一年啊!当然,我是个闲人,一年之中也没有多少时日是必须在人间的,因此,我希望选一个最长的空闲时间段,使我在天上待的时间尽量长。记住,今年是4000年。天上一天也是24小时,每小时60分,每分60秒。
输入
第一行是一个非负整数 N,表示4000年中必须呆在人间的天数,以下共N行,每行两个用空格隔开的正整数,即日期(月,日),输入保证无错误,日期无重复。
输出
仅有一行包含一个非负整数,即在天上的时间(四舍五入精确到秒)。
样例输入
2
3 8
12 2
样例输出
63266
模拟,注意边界1月1号,12月31号,
日期之间的距离多少天,都统计距离1月1号的天数相减即可。
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstdlib>
#include <stack>
#include <cstring>
#include <string>
#include <queue>
#define maxn 2000 + 10
#define INF 0x3f3f3f3f
using namespace std;
int day[13] = {31,29,31,30,31,30,31,31,30,31,30,31};
struct node{
int l,r;
node (int l = 0, int r = 0):l(l),r(r){}
bool operator < (const node & a)const{
if( l == a.l) return r < a.r;
return l < a.l;
}
}no[maxn];
int cal(int i){
int monl = no[i].l;
int dayl = no[i].r;
int ans = 0;
for(int i=0;i<monl-1;i++)
ans += day[i];
ans += dayl;
return ans;
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
int ff = 0;
int rr = 0;
for(int i=0;i<n;i++){
scanf("%d%d",&no[i].l,&no[i].r);
if(no[i].l == 12 && no[i].r == 31)
rr = 1;
if(no[i].l == 1 && no[i].r == 1)
ff = 1;
}
int l = n;
if(!rr){
no[l++] = node(12,31);
}
if(!ff){
no[l++] = node(1,1);
}
sort(no,no + l);
int maxx = -1;
for(int i=1;i<l;i++){
int tmp = cal(i) - cal(i-1) - 1;
if(ff != 1 && no[i-1].l == 1 && no[i-1].r == 1){
tmp++;
}
if(rr != 1 && no[i].l == 12 && no[i].r == 31){
tmp++;
}
maxx = max(maxx,tmp);
}
double ans = ((double)maxx* (24*60*60)/366.0) ;
if(n == 0){
printf("%.f\n", 1.0*(24*60*60));<span style="display: none; width: 0px; height: 0px;" id="transmark"></span>
}
else
printf("%d\n",(int)(ans+0.5));
//printf("%.f\n",(ans));//一样可以四舍五入
}
return 0;
}