P1178 【到天宫做客】

· · 题解

也是模拟赛的一题qwq……写了六次才过qwq……

有点考语文啊qwq……

梳理一下题目要点:

1.4000年能被400整除,所以是闰年,2月29天,全年366天。

2.天上一日,人间一年。所以人间的一天等于天上的1/366天。

放代码:

#include <bits/stdc++.h>
using namespace std;
int n,i,j,k,s,a[1000001],b[1000001],x[1000001],y[1000001],maxn;
double ans;
struct qwq{
    int x;
    int y;
}d[1000001];
bool cmp(qwq xx,qwq yy){
    if (xx.x==yy.x) return (xx.y<yy.y);
    return (xx.x<yy.x);
}
int months(int p){
    if (p==1||p==3||p==5||p==7||p==8||p==10||p==12) return 31;
    if (p==2) return 29;
    if (p==4 ||p==6||p==9||p==11) return 30;
}
int main(){
    scanf("%d",&n);
    for (i=1;i<=n;i++) scanf("%d%d",&d[i].x,&d[i].y);
    sort(d+1,d+n+1,cmp); 
    for (i=1;i<=n;i++) { 
        for (j=1;j<=d[i].x-1;j++)  b[i]+=months(j);
        b[i]+=d[i].y;
    }
    b[n+1]=367;b[0]=0;
    for (i=0;i<=n;i++) a[i]=b[i+1]-b[i]-1;
    for (i=0;i<=n;i++) maxn=max(maxn,a[i]);
    maxn=maxn*24*60*60;
    ans=(maxn*1.0)/366.00+0.5;
    cout<<(int)ans<<endl;
    return 0;
}
//a[i]表示b[i+1]-b[i]

一些思路和坑点:

对于每一个宴会日期,算出它是那一年的第几天,然后算出每个宴会时间之间的差值。

还要算两头,一头是0,一头是367。

为了方便排序,运用了结构体。