【模拟】时间计算 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;
}

 

 

posted @ 2012-09-16 20:17  jiangzh  阅读(184)  评论(0编辑  收藏  举报