刷题——贪心+日期问题

刷题

题目描述

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

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

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

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

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

输入格式

第一行一个整数 N N N,表示洛谷 Online Judge 的题目数, N ≤ 5000 N≤5000 N5000

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

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

输出格式

一行,一个整数,NOIP 前最多刷的题目数。

样例 #1

样例输入 #1

2
1
1
2007-06-23-11:59
2007-06-23-12:00

样例输出 #1

1

思路

这道题就是日期处理起来比较麻烦,这里有个技巧,叫做多退少补。

代码

//贪心+时间计算

#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long

using namespace std;

const int N = 5010;

int w[N],n;
int y1,m1,d1,h1,min1;
int y2,m2,d2,h2,min2;
int months[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int t;//总时间
int ans;

bool check(int y){
    if((y%4==0&&y%100)||y%400==0){
        months[2]=29;
        return true;
    }
    months[2]=28;
    return false;
}

void work(){
    for(int i=y1;i<y2;i++){
        if(check(i))t+=366;
        else t+=365;
    }
    
    check(y1);
    for(int i=1;i<m1;i++){
        t-=months[i];
    }
    
    check(y2);
    for(int i=1;i<m2;i++){
        t+=months[i];
    }
    
    for(int i=1;i<d1;i++){
        t--;
    }
    
    for(int i=1;i<d2;i++){
        t++;
    }
    
    t=t*24*60;
    t-=60*h1+min1;
    t+=60*h2+min2;
    
    // cout<<t<<endl;
    
    for(int i=1;i<=n;i++){
        if(t>=w[i]){
            t-=w[i];
            ans++;
        }else{
            break;
        }
    }
    
}

signed main(){
    cin>>n;
    
    for(int i=1;i<=n;i++){
        cin>>w[i];
    }
    
    sort(w+1,w+1+n);
    
    scanf("%d-%d-%d-%d:%d",&y1,&m1,&d1,&h1,&min1);
    scanf("%d-%d-%d-%d:%d",&y2,&m2,&d2,&h2,&min2);
    
    work();
    
    cout<<ans;
    
    return 0;
}
  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

green qwq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值