P8903 [USACO22DEC] Bribing Friends G 看电影
P8903 [USACO22DEC] Bribing Friends G 看电影
题目描述
Bessie 想要观看纪录片:奶牛基因组学,但她不想一个人去。不幸的是,她的朋友们没有足够的热情和她一起去!于是,Bessie 需要贿赂她的朋友们陪她去电影院。她的贿赂武器库中有两种工具:哞尼和冰激凌甜筒。
Bessie 有
Bessie 有
输入格式
输入的第 1 行包含三个整数
以下
输出格式
输出陪 Bessie 的朋友们的最大受欢迎度之和,假设她以最优方案花费她的哞尼和冰激凌甜筒。
样例 #1
样例输入 #1
3 10 8
5 5 4
6 7 3
10 6 3
样例输出 #1
15
提示
样例 1 解释
Bessie 可以将
测试点性质
- 测试点
满足 以及 。 - 测试点
满足 。 - 测试点
满足 。 - 测试点
满足 。 - 测试点
没有额外限制。
感觉洛谷和oj上的翻译不太一样啊。
题目大意
现在有
考试时想到了
#include <bits/stdc++.h>
#define fu(x, y, z) for (int x = y; x <= z; x++)
#define LL long long
using namespace std;
const int N = 205;
LL f[N][N][N], ans;
int n, a, b, p[N], c[N], x[N];
int main() {
scanf("%d%d%d", &n, &a, &b);
fu(i, 1, n) { scanf("%d%d%d", &p[i], &c[i], &x[i]); }
LL ct;
fu(i, 0, a) {
fu(j, 0, b) {
fu(k, 1, n) {
for (int l = 0; l <= c[k] && j >= l * x[k]; l++) {
ct = c[k] - l;
if (i < ct)
continue;
f[i][j][k] = max(f[i - ct][j - l * x[k]][k - 1] + p[k], f[i][j][k]);
}
f[i][j][k] = max(f[i][j][k - 1], f[i][j][k]);
ans = max(ans, f[i][j][k]);
}
}
}
printf("%lld", ans);
// printf ("%lld" , f[a][b][n]);
return 0;
}
正解是贪心:
先把朋友按照
先前往后做一遍
然后从后往前做一遍
最后枚举
按照
排序是因为,是冰淇淋的性价比最大
code
#include <bits/stdc++.h>
#define fu(x , y , z) for(int x = y ; x <= z ; x ++)
#define fd(x , y , z) for(int x = y ; x >= z ; x --)
using namespace std;
const int N = 2005;
int n , a , b , f[N][N] , g[N][N];
struct node {
int p , c , x;
} t[N];
bool cmp (node x , node y) { return x.x < y.x; }
int main () {
scanf ("%d%d%d" , &n , &a , &b);
fu (i , 1 , n) scanf ("%d%d%d" , &t[i].p , &t[i].c , &t[i].x);
sort (t + 1 , t + n + 1 , cmp);
fu (i , 1 , n) {
fu (j , 0 , b) {
f[i][j] = f[i - 1][j];
if (j >= t[i].x * t[i].c)
f[i][j] = max (f[i][j] , f[i - 1][j - t[i].x * t[i].c] + t[i].p);
}
}
fd (i , n , 1) {
fu (j , 0 , a) {
g[i][j] = g[i + 1][j];
if (j >= t[i].c)
g[i][j] = max (g[i][j] , g[i + 1][j - t[i].c] + t[i].p);
}
}
int ans = 0;
fu (i , 1 , n) {
ans = max (ans , f[i - 1][b] + g[i][a]);
ans = max (ans , f[i][b] + g[i + 1][a]);
for (int j = 0 ; j <= t[i].c && b >= j * t[i].x ; j ++) {
if (a < t[i].c - j) continue;
ans = max (ans , f[i - 1][b - j * t[i].x] + g[i + 1][a - (t[i].c - j)] + t[i].p);
}
}
printf ("%d" , ans);
return 0;
}
后记
感觉
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端