题目描述
NOIP 临近了,小 A 却发现他已经不会写题了。好在现在离竞赛还有一段时间,小 A 决定从现在开始夜以继日地刷题。也就是说小 A 废寝忘食,一天二十四小时地刷题。
今天的日期(时间)是 yyyy 年 mm 月 dd 日 hh 时 min 分,考试的时间是 yyyy2 年 mm2 月 dd2 日 hh2 时 min2 分。这之间的所有时间小 A 都用来刷题了,那么考试之前他最多能刷多少题呢?注意哦,考虑闰年。
时间紧张小 A 只管数量不管质量。当然有的题目容易一些,有的题目难一些。根据小 A 的经验,他能一眼看出写出某一个题目需要的时间,以分钟记。
现在给出洛谷 Online Judge 的题目列表,请你挑出最多的题目使小 A 能在竞赛前写出来。
我们假设从远古到未来,历法的表示与现在一样。
输入格式
第一行一个整数,表示洛谷Online Judge的题目数,
。
接下来 行,每行一个整数表示刷该题需要用的时间,以分钟记(
)。(这个题本身是什么并不重要,不是么?小A已经写过题目数为
个)。
接下来两行依次是当前时间和竞赛时间。时间给出的格式是:,例如:
,采用
小时制,每天从
到
,年份从
到
。
输出格式
一行,一个整数,NOIP 前最多刷的题目数。
样例
样例输入
2
1
1
2007-06-23-11:59
2007-06-23-12:00
样例输出
1
思路
纯纯的贪心做法,细心一点就行。
做用时最短的题,即让每次做题所用时间最小。
1. 给做题时间排序。
2. 算出总时间。(坑点)
3. 枚举每道题的做题时间,时间到时后输出循环次数。
完整代码
#include<bits/stdc++.h>
using namespace std;
int a[5005];
int ts[13]={0,31,0,31,30,31,30,31,31,30,31,30,31}; //每个月的天数
bool rn(int n){ //判断闰年
if(n%400==0||(n%4==0&&n%100!=0)) return true;
else return false;
}
int main()
{
int n,cnt=0;
long long time=0; //总时间(分钟)
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int y,mo,d,h,m,yy,mmo,dd,hh,mm;
scanf("%d-%d-%d-%d:%d",&y,&mo,&d,&h,&m);
scanf("%d-%d-%d-%d:%d",&yy,&mmo,&dd,&hh,&mm);
for(int i=y;i<=yy-1;i++)
if(rn(i)==true) time+=366*1440;
else time+=365*1440;
for(int i=1;i<=mo-1;i++)
if(i==2)
if(rn(y)==true) time-=29*1440; //别忘了特判闰年(2月)
else time-=28*1440;
else time-=ts[i]*1440;
for(int i=1;i<=mmo-1;i++)
if(i==2)
if(rn(yy)==true) time+=29*1440;
else time+=28*1440;
else time+=ts[i]*1440;
time=time-d*1440+dd*1440;
time-=(h*60+m),time+=(hh*60+mm);
sort(a+1,a+n+1); //给做题时间排序
for(int i=1;i<=n;i++)
if(time-a[i]>=0)
cnt++,time-=a[i]; //cnt记录循环次数
else break;
printf("%d",cnt);
return 0;
}