洛谷 P1178 到天宫做客

题目描述

有一天,我做了个梦,梦见我很荣幸的接到了猪八戒的邀请,到天宫陪他吃酒。我犹豫了。天上一日,人间一年啊!当然,我是个闲人,一年之中也没有多少时日是必须在人间的,因此,我希望选一个最长的空闲时间段,使我在天上待的时间尽量长。记住,今年是4000年。天上一天也是24小时,每小时60分,每分60秒。

输入输出格式

输入格式:

 

输入文件的第一行是一个非负整数 N,表示4000年中必须呆在人间的天数,以下共N行,每行两个用空格隔开的正整数,即日期(月,日),输入文件保证无错误,日期无重复。

 

输出格式:

 

输出文件仅有一行包含一个非负整数,即在天上的时间(四舍五入精确到秒)。

 

输入输出样例

输入样例#1: 复制
2
3 8
12 2
输出样例#1: 复制
63266
思路:模拟
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,ans,num[13];
struct nond{
    int month,day;
}v[366];
int tim(nond a,nond b){
    if(a.month==b.month)    return b.day-a.day-1;
    int bns=num[a.month]-a.day;
    for(int i=a.month+1;i<b.month;i++)    bns+=num[i];
    bns+=b.day-1;
    return bns;
}
int cmp(nond a,nond b){
    if(a.month==b.month)    return a.day<b.day;
    return a.month<b.month; 
}
int main(){
    scanf("%d",&n);
    num[1]=num[3]=num[5]=num[7]=num[8]=num[10]=num[12]=31;
    num[4]=num[6]=num[9]=num[11]=30;
    num[2]=29;
    for(int i=1;i<=n;i++)
        scanf("%d%d",&v[i].month,&v[i].day);
    v[n+1].month=1;v[n+1].day=0;
    v[n+2].month=12;v[n+2].day=32;
    sort(v+1,v+3+n,cmp);
    for(int i=1;i<=n+1;i++)
        ans=max(ans,tim(v[i],v[i+1]));
    ans=ans*24*60*60;
    if(ans%366<183)    printf("%d",ans/366);
    else printf("%d",ans/366+1);
}

 

 
posted @ 2017-11-19 17:04  一蓑烟雨任生平  阅读(454)  评论(0编辑  收藏  举报