P1178 到天宫做客

题目描述

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

输入格式

第一行是一个非负整数 N,表示4000年中必须呆在人间的天数。

以下共NN行,每行两个用空格隔开的正整数,即日期(月,日),输入文件保证无错误,日期无重复。

输出格式

一个非负整数,即在天上的时间(四舍五入精确到11秒)。

输入输出样例

输入 #1复制

2
3 8
12 2

输出 #1复制

63266

解题思路:

目标: 寻找最大区间

注意:日期无序, 12月31日与 1月1日, 4000年为闰年,366天

方法一:

                开一个368的bool数组;

                把刚读入的日期转换称一年中的第几天,并在bool数组中标记它, 最后标记第367天

扫描二维码关注公众号,回复: 13294872 查看本文章

                遍历象征一年的bool数组,pre(前一个呆在人间的日子)是1(第一天)开始,max_初始化为0

                遇到一个被标记的日子y[i] == 1就,比较当前最大区间值与当前被标记日子与前一个被标记日子的差,即i-pre > max_, 若成立则更新max_ ;

                attention: 不论i-pre > max_成立与否,都要更新pre;

#include <bits/stdc++.h>
#define MAXN 2005
#define inf 0x3f3f3f3f
#define rep(x, a, b) for(int x=a; x<=b; x++)
#define per(x, a, b) for(int x=a; x>=b; x--)
using namespace std;
//                        1   2   3   4   5   6       7   8   9   10      11  12
int month2[13] = {0,  31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 };
bool y[367];

int main()
{
    int n;
    scanf("%d", &n);
    if(n == 0)
    {
        cout<<366*24*3600/366;
        return 0;
    }
    rep(i, 1, n)
    {
        int m,d;
        cin>>m>>d;
        int index =  month2[m-1]+d;
        y[index] = true;
    }
    int max_ = 0;
    int pre = 1;
    y[367] = true;
    rep(i, 1, 367)
    {
        if( y[i])
        {
            if(i - pre > max_)
            {
                max_ = i-pre;
            }
             pre = i+1;
        }
    }
    double ans = max_*24*60*60/366;
    int sum = ans+0.5;
    cout<<sum;
    return 0;
}

方法二:

                构造存 月份和日期的数组 m[], d[];

                先读入日期;

                写个比较器或者balabala的方法去给日期从小到大排个序;

                排完后遍历,比较相邻日期相差的值,找出最大的max_;

                剩余同上;

猜你喜欢

转载自blog.csdn.net/m0_54674275/article/details/121246259