60分球调

P1167 刷题

cgxd @ 2024-04-20 16:50:38

#include<bits/stdc++.h>
using namespace std;
const int d[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
deque<int> dq;
int n, k, cnt;
struct date{
    int year, month, day, hour, min;
}d1, d2;
bool run(int y){
    if(y % 4)
        return 0;
    if(y % 400 xor y % 100)
        return 0;
    return 1;
}bool operator<(date d1, date d2){
    if(d1.year != d2.year)
        return d1.year < d2.year;
    if(d1.month != d2.month)
        return d1.month < d2.month;
    return d1.day < d2.day;
}int operator-(date d1, date d2){
    int cnt = 0;
    if(!(d1 < d2 or d2 < d1))
        return (d1.hour - d2.hour) * 60 + d1.min - d2.min;
    if(d1.year == d2.year and d1.month == d2.month){
        cnt = (d1.day - d2.day) * 1440;
        d1.day = d2.day;
        return cnt + (d1 - d2);
    }if(d1.year == d2.year){
        for(int i = d2.month; i < d1.month; i++)
            cnt += d[i] + (i == 2 and run(d1.year));
        cnt *= 1440;
        d1.month = d2.month;
        return cnt + (d1 - d2);
    }date d3 = {d1.year, 2, 29, 0, 0};
    date d4 = {d2.year, 2, 29, 0, 0};
    for(int i = d2.year + (d2 < d4); i <= d1.year + (d3 < d1); i++){
        cnt += 365 + run(i);
    }d1.year = d2.year;
    return cnt * 1440 + (d1 - d2);
}int main(){
    cin >> n;
    while(n--){
        int k;
        cin >> k;
        dq.push_back(k);
    }sort(dq.begin(), dq.end());
    scanf("%d-%d-%d-%d:%d", &d1.year, &d1.month, &d1.day, &d1.hour, &d1.min);
    scanf("%d-%d-%d-%d:%d", &d2.year, &d2.month, &d2.day, &d2.hour, &d2.min);
    k = d2 - d1;
    while(1){
        k -= dq[0];
        if(dq.empty() or k < 0)
            break;
        cnt++;
        dq.pop_front();
    }cout << cnt;
    return 0;
}

|