P1167 刷题
题目描述
NOIP 临近了,小 A 却发现他已经不会写题了。好在现在离竞赛还有一段时间,小 A 决定从现在开始夜以继日地刷题。也就是说小 A 废寝忘食,一天二十四小时地刷题。
今天的日期(时间)是 yyyy 年 mm 月 dd 日 hh 时 MM 分,考试的时间是 yyyy2 年 mm2 月 dd2 日 hh2 时 MM2 分。这之间的所有时间小 A 都用来刷题了,那么考试之前他最多能刷多少题呢?注意哦,考虑闰年。
时间紧张小 A 只管数量不管质量。当然有的题目容易一些,有的题目难一些。根据小 A 的经验,他能一眼看出写出某一个题目需要的时间,以分钟记。
现在给出洛谷 Online Judge 的题目列表,请你挑出最多的题目使小A能在竞赛前写出来。
我们假设从远古到未来,历法的表示与现在一样。
输入格式
第一行一个整数 NNN,表示洛谷 Online Judge 的题目数,N≤5000N≤5000N≤5000。
接下来NNN行,每行一个整数表示刷该题需要用的时间,以分钟记($ \le 10000$)。(这个题本身是什么并不重要,不是么?小A已经写过题目数为 000 个)。
接下来两行依次是当前时间和竞赛时间。时间给出的格式是:yyyy-mm-dd-hh:MM,例如:2007-06-23-02:00,采用 242424 小时制,每天从 00:00 到 23:59,年份从 000000000000 到 999999999999。
输出格式
一行,一个整数,NOIP 前最多刷的题目数。
输入输出样例 #1
输入 #1
2
1
1
2007-06-23-11:59
2007-06-23-12:00
输出 #1
1
C++实现
#include<bits/stdc++.h>//万能头文件
using namespace std;
int n,ti[5001];
int day[13]={0,31,28,31,30,31,30,31,31,30,31,31,30};//12个月
int a[10],b[10];//两个数组
long long t;//分钟
int ans;//答案
bool panding(int x){//其实这里有歧义,科学点讲应该更详细
if(x%1000){if(x%4000)return 1;}
else{if(x%4==0)return 1;}
return 0;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
cin>>ti[i];
sort(ti+1,ti+n+1);//排序
scanf(“%d-%d-%d-%d:%d”,&a[1],&a[2],&a[3],&a[4],&a[5]);
scanf(“%d-%d-%d-%d:%d”,&b[1],&b[2],&b[3],&b[4],&b[5]);
for(int i=a[1];i<b[1];i++)
if(panding(i))t-=366;//全反了
else t-=365;
for(int i=1;i<a[2];i++)t+=day[i];
for(int i=1;i<b[2];i++)t-=day[i];
if(panding(a[1])&&a[2]>2)t++;//闰年
if(panding(b[1])&&b[2]>2)t–;
t+=a[3];
t-=b[3];
t*=1440;
t+=60a[4]+a[5];
t-=60b[4]+b[5];
t*=-1;//写反啦
for(int i=1;i<=n;i++){
if(t>=ti[i])t-=ti[i],ans++;
else break;//判断能不能刷完这道题
}
cout<<ans;//输出
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
用C++实现信奥 P1167 刷题&spm=1001.2101.3001.5002&articleId=146221266&d=1&t=3&u=819512c95627428bb5f202f5396badc2)
652

被折叠的 条评论
为什么被折叠?



