1 条题解

  • 1
    @ 2022-8-31 9:15:19
    #include <stdio.h>
    #include <stdlib.h>
    #include <algorithm>
    #include <string.h>
    #include <vector>
    #include <math.h>
    #include <queue>
    #include <set>
    #include <functional>
    #include <time.h>
    #define INF 0x3f3f3f3f
    using namespace std;
    typedef long long ll;
    const int maxn = 2005, maxf = 4005;
    int dp[maxn][maxn], f[maxn][maxf], sell[maxn], money[maxn], dist[maxn], price[maxn], fix[maxn];
    int que[maxf][maxn], he[maxf], ta[maxf];
    bool chosen[maxn];
    int main(){
        int n, m, maxF, maxD;
        scanf("%d%d%d%d", &n, &m, &maxF, &maxD);
        if(maxF > 2 * n) maxF = 2 * n;
        for(int i = 1; i <= n; i++) scanf("%d%d%d%d%d", sell+i, money+i, dist+i, price+i, fix+i);
        for(int i = 1; i <= n; i++) if(dist[i] - dist[i - 1] > maxD){
            puts("Poor Coke!");
            return 0;
        }
        memset(dp, -1, sizeof(dp));
        dp[0][0] = 0;
        for(int i = 1; i <= n; i++)
        for(int j = 0; j <= m; j++){
            if(dp[i - 1][j] >= 0) dp[i][j] = dp[i - 1][j];
            if(j >= sell[i] && dp[i - 1][j - sell[i]] >= 0)
                dp[i][j] = max(dp[i][j], dp[i - 1][j - sell[i]] + money[i]);
        }
        int maxS = 0;
        for(int i = 0; i <= m; i++) if(dp[n][i] > dp[n][maxS]) maxS = i;
        for(int i = n, j = maxS; i >= 1; i--){
            if(dp[i][j] == dp[i - 1][j]) continue;
            else chosen[i] = true, j -= sell[i];
        }
        memset(f, 0x3f, sizeof(f));
        f[0][maxF] = 0;
        que[maxF][ta[maxF]++] = 0;
        for(int i = 1; i <= n; i++)
        for(int j = 0; j <= maxF; j++){
            if(price[i] > 0 && j > 0) f[i][j] = min(f[i][j], f[i][j - 1] + price[i]);
            if(ta[j + 2] > he[j + 2]) f[i][j] = min(f[i][j], f[que[j + 2][he[j + 2]]][j + 2] + fix[i]);
            if(chosen[i]) he[j] = ta[j] = 0;
            while(ta[j] > he[j] && f[que[j][ta[j] - 1]][j] >= f[i][j]) ta[j]--;
            que[j][ta[j]++] = i;
            while(he[j] < ta[j] && dist[i + 1] - dist[que[j][he[j]]] > maxD) he[j]++;
        }
        int minC = 0;
        for(int i = 0; i <= maxF; i++) if(f[n][i] < f[n][minC]) minC = i;
        if(f[n][minC] == INF) puts("Poor Coke!");
        else printf("%d %d", dp[n][maxS], dp[n][maxS] - f[n][minC]);
        return 0;
    }
    
    • 1

    信息

    ID
    1268
    时间
    1000ms
    内存
    125MiB
    难度
    6
    标签
    递交数
    1
    已通过
    1
    上传者