时间计算
(heaven.pas/c/cpp)
【问题描述】
有一天,我做了个梦,梦见我很荣幸的接到了猪八戒的邀请,到天宫陪他吃酒。我犹豫了。天上一日,人间一年啊!当然,我是个闲人,一年之中也没有多少时日是必须在人间的,因此,我希望选一个最长的空闲时间段,使我在天上待的时间尽量长。记住,今年是4000年。天上一天也是24小时,每小时60分,每分60秒。
【输入数据】
输入文件的第一行是一个非负整数 N,表示4000年中必须呆在人间的天数,以下共N行,每行两个用空格隔开的正整数,即日期(月,日),输入文件保证无错误,日期无重复。
【输出数据】
输出文件仅有一行包含一个非负整数,即在天上的时间(四舍五入精确到秒)。
【样例输入】heaven.in
2
3 8
12 2
【样例输出】heaven.out
63266
很显然 这一题是找一个最长的区间(注意取不到端点)
注意4000年是闰年就行了
C++ Code
/*
C++ Code
http://oijzh.cnblogs.com
*/
#include<cstdio>
#include<queue>
using namespace std;
const int mon[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int n,sumd[13];
priority_queue<int,vector<int>,greater<int> > q;
priority_queue<int,vector<int>,less<int> > ans;
int main()
{
freopen("heaven.in","r",stdin);
freopen("heaven.out","w",stdout);
scanf("%d",&n);
if(n==0){printf("86400");exit(0);}//处理特殊情况
for(int i=1;i<=12;i++) sumd[i]=sumd[i-1]+mon[i];
int m,d,day;
for(int i=1;i<=n;i++)
{
scanf("%d %d",&m,&d);
if(m==1)day=0;
else day=sumd[m-1];
day+=d;
q.push(day);
}
ans.push(q.top()-1);//入队第一天到第一个必须在地上的那天的情况
while(!q.empty())
{
int l,r;
l=q.top();q.pop();r=q.top();
ans.push(r-l-1);
}
ans.push(sumd[12]-q.top());//入队最后一个必须在地球上的天到最后一天的情况
double max=ans.top();
max=max*24*60*60/sumd[12]+0.5;
printf("%d",(int)max);
return 0;
}