P1167 刷题

刷题

题目描述

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

思路分析:
虽然这个题是标签贪心,但是直接一个排序就可以直接解决了,哎这个题本质还是一大模拟;
模拟过程:
假定日期:为a年–>b年
1–先把a年到b-1年的整年的年数的时间加上
2–因为a年不一定是整年比如2022年3月,因此要把前面三月的部分删除
3–还没把b年的后面的部分加上,加上即可

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
int arr[5005];
int months[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };//月份数组
int a1, b1, c1, d1, e1, a2, b2, c2, d2, e2;
bool is_leap(int x)//判断是否闰年
{
    if (x % 4 == 0 && x % 100 || x % 400 == 0) return true;
    return false;
}
int get_days(int year, int month){//计算天数
    if (is_leap(year) && month == 2) return months[month] + 1;
    //闰年二月多一天
    else return months[month];//其他正常
}
int main()
{
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> arr[i];
    sort(arr, arr + n);
    scanf("%d-%d-%d-%d:%d", &a1, &b1, &c1, &d1, &e1);//开始时间
    scanf("%d-%d-%d-%d:%d", &a2, &b2, &c2, &d2, &e2);//截止时间
    //cout << get_days(a1, 12) << endl;
    int sum=0;
    for (int i = a1; i < a2; i++)//先不考虑最后一年
    {
        if (is_leap(i)) sum += 366*1440;//天数*一天多少分钟
        else sum += 365*1440;
    }
    //cout << sum << endl << "这是整体" << endl;
    //------------------------------------------减
    //因为开始时间不一定是整年要把多余部分去掉
    //比如2022年3月开始的,我们要把多加的这三个月删除
    for (int i = 1; i < b1; i++)//枚举第开始年份的每一个月
    {
        sum -= get_days(a1,i)*1440;
    }
    //cout << sum << endl;
    sum -= ((c1 - 1) * 1440 + (d1 - 1) * 60 + e1);
    //然后下一步加上最后一年的最后部分
    //-----------------------------------------加
    for (int i = 1; i < b2; i++)
    {
        sum += get_days(a2,i) * 1440;
    }
    sum += (c2 - 1) * 1440 + (d2 - 1) * 60 + e2;
  //  cout << sum;
    int res = 0;
    for (int i = 0; i < n; i++)
    {
        if (sum >= arr[i]) res++, sum -= arr[i];//贪心过程很简单不解释了
        else break;
    }
    cout << res;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值