题解 P1178 【到天宫做客】

· · 题解

比较水的模拟。发现这题没有很多题解,发一个。

思路:

用一个数组f[]将一月至十二月之前累计的总共天数分别存起来。那么f数组就是这个样子:

    f[1]=0;
    f[2]=31;
    f[3]=60;
    f[4]=91;
    f[5]=121;
    f[6]=152;
    f[7]=182;
    f[8]=213;
    f[9]=244;
    f[10]=274;
    f[11]=305;
    f[12]=335;

(也可以用int f[]={}) 然后要读入有事的日期。可以在输入时利用f数组求出输入的每个日期在这一年中是第几天。把date数组对应的这一个日期做标记。

    for (i=1;i<=n;i++)
    {
        cin>>m>>d;
        tem=f[m];
        tem+=d;
        date[tem]=1;
    }

读入了有事的日期后,需要求最长连续天数。那么可以用一个循环,从1到366(4000是闰年),累加。到了有事的日期就将用来累计的变量清空。

    for (i=1;i<=366;i++)
    {
        if (date[i]==1)
        {
            sum=0;
        } else sum++;
        if (sum>bi) bi=sum;
    }

把天数转换为秒数,然后除以366(除以366是因为天上一日,人间一年),最后输出即可。 顺便说一下,保留整数可以cout<<fixed<<setprecision(0)<<要输出的数字,当然,用printf更简便,直接加个.0即可。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iomanip>
using namespace std;
int f[12],date[400];
double k;
long long i,n,m,d,tem,bi,sum;
int main()
{
    f[1]=0;
    f[2]=31;
    f[3]=60;
    f[4]=91;
    f[5]=121;
    f[6]=152;
    f[7]=182;
    f[8]=213;
    f[9]=244;
    f[10]=274;
    f[11]=305;
    f[12]=335;
    cin>>n;
    for (i=1;i<=n;i++)
    {
        cin>>m>>d;
        tem=f[m];
        tem+=d;
        date[tem]=1;
    }
    for (i=1;i<=366;i++)
    {
        if (date[i]==1)
        {
            sum=0;
        } else sum++;
        if (sum>bi) bi=sum;
    }
    k=bi*24*60*60*1.0/366;
    cout<<fixed<<setprecision(0)<<k;
}