问题 C: 到天宫做客
时间限制: 1 Sec 内存限制: 128 MB
提交: 100 解决: 26
[提交][状态][讨论版]
题目描述
有一天,我做了个梦,梦见我很荣幸的接到了猪八戒的邀请,到天宫陪他吃酒。我犹豫了。天上一日,人间一年啊!当然,我是个闲人,一年之中也没有多少时日是必须在人间的,因此,我希望选一个最长的空闲时间段,使我在天上待的时间尽量长。记住,今年是4000年。天上一天也是24小时,每小时60分,每分60秒。
输入
第一行是一个非负整数 N,表示4000年中必须呆在人间的天数,以下共N行,每行两个用空格隔开的正整数,即日期(月,日),输入保证无错误,日期无重复。
输出
仅有一行包含一个非负整数,即在天上的时间(四舍五入精确到秒)。
样例输入
2
3 8
12 2
样例输出
63266 解题思路:今天是难忘的一天,体会到了一句话,不到最后关头绝不能放弃!最后一分钟AC通过!
落掉一种情况,就是两个相邻的日期是在一个月内的时候,我的算法会计算错误。
感觉自己想出来的方法经常是相当冗余且容易出错,还是自己功力不够啊。
选取算法的时候应选取简单地不容易出错的才行。
能一块讨论就没必要分情况讨论,要注意合并相同的一些情况。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm> using namespace std; typedef struct node{
int month;
int day;
};
node a[]; int cmp(node a,node b){
return (a.month<b.month) || (a.month==b.month&&a.day<b.day);
} int main()
{
int n;
int maxx=;
int daycount[]={};
int monthday[]={,,,,,,,,,,,,};
scanf("%d",&n);
if(n==){
printf("86400\n");
return ;
}
if(n==){
printf("0\n");
return ;
}
for(int i=;i<n;i++){
scanf("%d %d",&a[i].month,&a[i].day);
}
sort(a,a+n,cmp);
for(int i=;i<n+;i++){
if(i==){
for(int j=;j<a[i].month;j++){
daycount[i]+=monthday[j];
}
daycount[i]+=a[i].day-;
}
if(i==n){
for(int j=a[i-].month+;j<=;j++){
daycount[i]+=monthday[j];
}
daycount[i]+=(monthday[a[i-].month]-a[i-].day);
}
if(i!=&&i!=n&&a[i].month!=a[i-].month){
for(int j=a[i-].month+;j<a[i].month;j++){
daycount[i]+=monthday[j];
}
daycount[i]+=(monthday[a[i-].month]-a[i-].day);
daycount[i]+=a[i].day-; }
if(i!=&&i!=n&&a[i].month==a[i-].month){//这种情况做的时候被落掉!
daycount[i]+=a[i].day-a[i-].day-;
}
maxx=max(daycount[i],maxx);
}
double second=maxx**1.0/;
printf("%.0lf\n",maxx**1.0/); return ;
}