【模拟】时间计算 heaven

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-21 15:41   1946   0

时间计算
(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;
}

转载于:https://www.cnblogs.com/oijzh/archive/2012/09/16/2687796.html

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP