题目描述
有一天,我做了个梦,梦见我很荣幸的接到了猪八戒的邀请,到天宫陪他吃酒。我犹豫了。天上一日,人间一年啊!当然,我是个闲人,一年之中也没有多少时日是必须在人间的,因此,我希望选一个最长的空闲时间段,使我在天上待的时间尽量长。记住,今年是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天
遍历象征一年的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_;
剩余同上;