1 条题解
-
1
#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
- 上传者