题解 P1178 【到天宫做客】

· · 题解

模拟,注意边界1月1号,12月31号,

日期之间的距离多少天,都统计距离1月1号的天数相减即可。

[codec]

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstdlib>
#include <stack>
#include <cstring>
#include <string>
#include <queue>
#define maxn 2000 + 10
#define INF 0x3f3f3f3f
using namespace std;
int day[13] = {31,29,31,30,31,30,31,31,30,31,30,31};
struct node{
    int l,r;
    node (int l = 0, int r = 0):l(l),r(r){}
    bool operator < (const node & a)const{
        if( l == a.l) return r < a.r;
        return l < a.l;
    }
}no[maxn];
int cal(int i){
    int monl = no[i].l;
    int dayl = no[i].r;
    int ans = 0;
    for(int i=0;i<monl-1;i++)
        ans += day[i];
    ans += dayl;
    return ans;
}
int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        int ff = 0;
        int rr = 0;
        for(int i=0;i<n;i++){
            scanf("%d%d",&no[i].l,&no[i].r);
            if(no[i].l == 12 && no[i].r == 31)
                rr = 1;
            if(no[i].l == 1 && no[i].r == 1)
                ff = 1;
        }
        int l = n;
        if(!rr){
            no[l++] = node(12,31);
        }
        if(!ff){
            no[l++] = node(1,1);
        }
        sort(no,no + l);
        int maxx = -1;
        for(int i=1;i<l;i++){
            int tmp = cal(i) - cal(i-1) - 1;
            if(ff != 1 && no[i-1].l == 1 && no[i-1].r == 1){
                tmp++;
            }
            if(rr != 1 && no[i].l == 12 && no[i].r == 31){
                tmp++;
            }
            maxx = max(maxx,tmp);
        }
        double ans = ((double)maxx* (24*60*60)/366.0) ;
        if(n == 0){
            printf("%.f\n", 1.0*(24*60*60));<span style="display: none; width: 0px; height: 0px;" id="transmark"></span>
        }
        else
            printf("%d\n",(int)(ans+0.5));
            //printf("%.f\n",(ans));//一样可以四舍五入
    }
    return 0;
}

[/codec]