90分求助
  • 板块P1833 樱花
  • 楼主焚魂
  • 当前回复7
  • 已保存回复7
  • 发布时间2021/7/22 01:59
  • 上次更新2023/11/4 13:53:32
查看原帖
90分求助
206423
焚魂楼主2021/7/22 01:59

最后一个点未过,不知道为什么,思路就是转化为01背包和完全背包两个dp就好了:

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

long long h,m,hh,mm;
char ch;
long long n;
long long t[10010],c[10010],p[10010];
long long dp[10010];
long long t1[10010],c1[10010],p1[10010];
long long t2[10010],c2[10010],p2[10010];
long long cnt1, cnt2;

int main() {
    cin >> h;
    ch = getchar();
    cin >> m >> hh;
    ch = getchar();
    cin >> mm >> n;
    long long time = (hh - h)*60+(mm-m);
    for(long long i = 1;i <= n;i++) {
        cin >> t[i] >> c[i] >> p[i];
        if(p[i] == 0) {
            t2[++cnt2] = t[i];
            c2[cnt2] = c[i];
            p[cnt2] = p[i];
        }
        else {
            if(p[i] == 1) {
                t1[++cnt1] = t[i];
                c1[cnt1] = c[i];
                p1[cnt1] = p[i];
            }
            else {
                bool f = false;
                long long res = 0;
                long long tt = p[i];
                for(long long j = 1;j <= p[i];j*=2) {
                    if(tt-j < 0)
                    break;
                    t1[++cnt1] = t[i]*j;
                    c1[cnt1] = c[i]*j;
                    p1[cnt1] = j;
                    tt -= j;
                }
                if(tt) {
                    t1[++cnt1] = t[i] * tt;
                    c1[cnt1] = c[i] * tt;
                    p1[cnt1] = tt;
                }
            }
        }
    }

    for(long long i = 1;i <= cnt1;i++) {
        for(long long j = time;j >= t1[i];j--) {
            dp[j] = max(dp[j],dp[j-t1[i]]+c1[i]);
        }
    }
    for(long long i = 1;i <= cnt2;i++) {
        for(long long j = t2[i];j <= time;j++) {
            dp[j] = max(dp[j],dp[j-t2[i]]+c2[i]);
        }
    }

    // cout << time << endl;
    // for(long long i = 1;i <= cnt1;i++)
    //     cout << t1[i] << " " << c1[i] << " " << p1[i] << endl;
    // for(long long i = 1;i <= cnt2;i++)
    //     cout << t2[i] << " " << c2[i] << " " << p2[i] << endl;
    cout << dp[time];

    return 0;
}
2021/7/22 01:59
加载中...