P1167 刷题 题解

 题目描述

NOIP 临近了,小 A 却发现他已经不会写题了。好在现在离竞赛还有一段时间,小 A 决定从现在开始夜以继日地刷题。也就是说小 A 废寝忘食,一天二十四小时地刷题。

今天的日期(时间)是 yyyy 年 mm 月 dd 日 hh 时 min 分,考试的时间是 yyyy2 年 mm2 月 dd2 日 hh2 时 min2 分。这之间的所有时间小 A 都用来刷题了,那么考试之前他最多能刷多少题呢?注意哦,考虑闰年。

时间紧张小 A 只管数量不管质量。当然有的题目容易一些,有的题目难一些。根据小 A 的经验,他能一眼看出写出某一个题目需要的时间,以分钟记。

现在给出洛谷 Online Judge 的题目列表,请你挑出最多的题目使小 A 能在竞赛前写出来。

我们假设从远古到未来,历法的表示与现在一样。

 输入格式

第一行一个整数N,表示洛谷Online Judge的题目数,$N \le5000$

接下来 N 行,每行一个整数表示刷该题需要用的时间,以分钟记($ \le 10000$)。(这个题本身是什么并不重要,不是么?小A已经写过题目数为 0 个)。

接下来两行依次是当前时间和竞赛时间。时间给出的格式是:yyyy-mm-dd-hh:min,例如:2007-06-23-02:00,采用 24 小时制,每天从 00:00 到 23:59 ,年份从 $0000$$9999$

 输出格式

一行,一个整数,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;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值