题解 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;
}