【模拟】时间计算 heaven
时间计算
(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; }
..... 转载请注明出处 ..... http://oijzh.cnblogs.com ..... by jiangzh