60pts求助
  • 板块P1167 刷题
  • 楼主hhy8399
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/1/26 23:04
  • 上次更新2025/1/27 13:53:33
查看原帖
60pts求助
1179906
hhy8399楼主2025/1/26 23:04

问:是否是日期计算的问题?(玄关)

#include <bits/stdc++.h>
using namespace std;

#define int long long

const int MAXN = 1e6 + 10;

int n,y,m,d,h,mi,y_1,m1,d1,h1,mi1,tim,ans,k = 1,a[MAXN];
map<int,int> mon;

void start() {
//map映射每月天数
    mon[1] = 31;
    mon[2] = 28;
    mon[3] = 31;
    mon[4] = 30;
    mon[5] = 31;
    mon[6] = 30;
    mon[7] = 31;
    mon[8] = 31;
    mon[9] = 30;
    mon[10] = 31;
    mon[11] = 30;
    mon[12] = 31;
}
//判断闰年
bool is_yyear(int x) {
    return (x % 100 != 0 && x % 4 == 0) || (x % 400 == 0);
}

//如果不是同一年时计算时间

void compute_time() {
    bool run = false;
    int day = 0;
//如果这不是某年的1月1日00:00就让y++稍后再处理
    if(m != 1 || d != 1 || h != 0 || mi != 0) {
        run = true;
        y ++;
    }
//计算整年的天数
    for(int year = y;year < y_1;year ++) {
        for(int month = 1;month <= 12;month ++) {
            day += mon[month];
            if(is_yyear(year) && month == 2) {
                day ++;
            }
        }
    }
//    printf("day:%d\ntime:%d\n",day,tim);
    if(h != 0 || mi != 0) {
        d ++;
        tim += 60 * (24 - h - 1) + (60 - mi);
        h = 0,mi = 0;
    }
    if(d != 1) {
        if(is_yyear(y) && m == 2) {
            day += mon[m] - d + 2;
        }
        else {
            day += mon[m] - d + 1;
        }
        d = 1;
        m ++;
    }
//处理少的日期
    if(run) {
        for(int i = m;i <= 12;i++) {
            if(is_yyear(i) && i == 2) {
                day ++;
            }
            day += mon[i];
        }
    }
//处理多的日期
    if(m1 != 1 || d1 != 1 || h1 != 0 || mi1 != 0) {
        tim += 60 * h1 + mi1;
        for(int i = 1;i < m1;i++) {
            day += mon[i];
            if(is_yyear(i) && i == 2) {
                day ++;
            }
        }
        day += d1;
    }
//    printf("day:%d\ntime:%d\n",day,tim);
    tim += day * 24 * 60;
    // printf("time2:%d\n",tim);
}
//同一年处理
void compute_time2() {
//同一天处理
    if(d == d1) {
        tim = (h1 - h - 1) * 60 + (60 - mi) + mi1;
        // cout << tim << endl;
        return ;
    }
//非同一天
    int day = 0;
    if(d != 1 || h != 0 || mi != 0) {
        tim += 60 * (24 - h - 1) + (60 - mi);
        d ++;
        h = 0,mi = 0;
        day += mon[m] - d + 1;
        if(is_yyear(y) && m == 2) {
            day ++;
        }
        d = 0;
        m ++;
    }
    for(int i = m;i < m1;i++) {
        if(is_yyear(y) && i == 2) {
            day ++;
        }
        day += mon[i];
    }
//    printf("day:%d\n",day);
    tim += h1 * 60 + mi1;
    day += d1;
    tim += day * 24 * 60;
    // cout << day << endl;
}

signed main() {
    start();
    scanf("%d",&n);
    for(int i = 1;i <= n;i++) {
        scanf("%d",&a[i]);
    }
    scanf("%d-%d-%d-%d:%d",&y,&m,&d,&h,&mi);
    scanf("%d-%d-%d-%d:%d",&y_1,&m1,&d1,&h1,&mi1);
    if(y != y_1) {
        compute_time();
    }
    else {
        compute_time2();
    }
    sort(a + 1,a + n + 1);
    while(tim >= 0) {
        ans ++;
        tim -= a[k];
        k ++;
    }
    cout << ans - 1 << endl;
    return 0;
}

2025/1/26 23:04
加载中...