P8903 [USACO22DEC] Bribing Friends G 看电影

题目传送门

题目描述

Bessie 想要观看纪录片:奶牛基因组学,但她不想一个人去。不幸的是,她的朋友们没有足够的热情和她一起去!于是,Bessie 需要贿赂她的朋友们陪她去电影院。她的贿赂武器库中有两种工具:哞尼冰激凌甜筒

Bessie 有 \(N(1 \le N \le 2000)\) 个朋友。然而,并非所有的朋友都是生而平等的!朋友 \(i\) 有受欢迎度 \(P_i(1 \le P_i \le 2000)\),Bessie 想最大化陪她的朋友们的受欢迎度之和。朋友 \(i\) 只有当 Bessie 给了她 \(C_i(1 \le C_i \le 2000)\) 哞尼才愿意陪她。如果 Bessie 给她 \(X_i(1 \le X_i \le 2000)\) 个冰激凌甜筒,她还可以给 Bessie \(1\) 哞尼的折扣。Bessie 可以从朋友那里得到任意整数数量的折扣,只要这些折扣不会使得朋友倒给她哞尼。

Bessie 有 \(A\) 哞尼和 \(B\) 个冰激凌甜筒可供使用(\(0 \le A,B \le 2000\))。请帮助她求出如果她以最优方案花费她的哞尼和冰激凌甜筒,她可以达到的最大受欢迎度之和。

输入格式

输入的第 1 行包含三个整数 \(N\),\(A\) 和 \(B\),分别表示 Bessie 拥有的朋友的数量,哞尼的数量和冰激凌甜筒的数量。

以下 \(N\) 行每行包含三个整数 \(P_i\),\(C_i\) 和 \(X_i\),表示受欢迎度(\(P_i\)),贿赂朋友 \(i\) 陪 Bessie 所需要的哞尼(\(C_i\)),以及从朋友 \(i\) 处获得 \(1\) 哞尼的折扣所需要的冰激凌甜筒的数量(\(X_i\))。

输出格式

输出陪 Bessie 的朋友们的最大受欢迎度之和,假设她以最优方案花费她的哞尼和冰激凌甜筒。

样例 #1

样例输入 #1

3 10 8
5 5 4
6 7 3
10 6 3

样例输出 #1

15

提示

样例 1 解释

Bessie 可以将 \(4\) 哞尼和 \(4\) 个冰激凌甜筒给奶牛 \(1\),将 \(6\) 哞尼和 \(3\) 个冰激凌甜筒给奶牛 \(3\),这样奶牛 \(1\) 和 \(3\) 就可以陪她,得到 \(5+10=15\) 的受欢迎度。

测试点性质

  • 测试点 \(2-4\) 满足 \(N \le 5\) 以及 \(C_i=1\)。
  • 测试点 \(5-7\) 满足 \(B=0\)。
  • 测试点 \(8-10\) 满足 \(N,A,B,P_i,C_i,X_i \le 50\)。
  • 测试点 \(11-15\) 满足 \(N,A,B,P_i,C_i,X_i \le 200\)。
  • 测试点 \(16-20\) 没有额外限制。

感觉洛谷和oj上的翻译不太一样啊。

题目大意

现在有 \(N\) 个人,每个人有一个欢迎程度 \(P\) ,代价 \(C\) ,代价减少 \(1\) 需要冰淇淋 \(X\) ,现在有 \(A\) 元钱和 \(B\) 个冰淇淋,求能达到的最大欢迎程度。

考试时想到了 \(O(n^4)\) 的朴素做法,类似背包 ,拿了60分

#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;
}

正解是贪心:

先把朋友按照 \(X\) 数组从小到大排序。

先前往后做一遍 \(dp\) :

\(f_{i , j}\) 表示 \(1\to i\) 的人只用 \(j\) 个冰淇淋收买的最大收益

然后从后往前做一遍 \(dp\) :

\(g_{i , j}\) 表示 \(i \to n\) 的人只用 \(j\) 元钱收买的最大收益。

最后枚举 \(j\) ,表示 \(j\) 前面的人只用冰淇淋售卖,后面的人只用前收买, \(j\) 既用钱也用冰淇淋收买,用 \(ans\) 记录最大值就好了。

按照 \(X\) 排序是因为,是冰淇淋的性价比最大

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;
}

后记

感觉 \(dp\) 挺重要的,要加强。

P8903 [USACO22DEC] Bribing Friends G 看电影的更多相关文章

  1. 开始ubuntu 14.04 的装X模式---终端模式下中文输入,听歌,上irc 开启framebuffer看电影 截图

    先上图吧 卡卡的全是在tty1 下的操作,看电影,听歌,截图 ,看图  ,上irc 等等,相当适合在小白面前装屁! 需要安装的软件: 为了能正常显示中文:安装fbterm sudo apt-get i ...

  2. 用Emacs看电影

    大多数人用emacs听歌,我却喜欢用emacs看电影.用 EMMS 和 mplayer 结合,看电影真是太方便了. 不要从源里安装EMMS,它可能给你安装别的播放器,没必要,我们有 mplayer 足 ...

  3. tyvj2059 元芳看电影

    描述 神探狄仁杰电影版首映这天,狄仁杰.李元芳和狄如燕去看电影.由于人实在是太多了,入场的队伍变得十分不整齐,一个人的前面可能会出现并排的好多人.“元芳,这队伍你怎么看?”“大人,卑职看不出这队伍是怎 ...

  4. [ZJOI2011]看电影(组合数学,高精度)

    [ZJOI2011]看电影 这题模型转化很巧妙.(神仙题) 对于这种题首先肯定知道答案就是合法方案除以总方案. 总方案显然是\(k^n\). 那么考虑怎么算合法方案. 当\(n>k\)的时候显然 ...

  5. HDU 3496 Watch The Movie(看电影)

    HDU 3496 Watch The Movie(看电影) Time Limit: 1000MS   Memory Limit: 65536K [Description] [题目描述] New sem ...

  6. UESTC_邱老师看电影 2015 UESTC Training for Dynamic Programming<Problem F>

    F - 邱老师看电影 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  7. [ZJOI2011]看电影(MOVIE)

    题目描述 到了难得的假期,小白班上组织大家去看电影.但由于假期里看电影的人太多,很难做到让全班看上同一场电影,最后大家在一个偏僻的小胡同里找到了一家电影院.但这家电影院分配座位的方式很特殊,具体方式如 ...

  8. 【BZOJ2227】[ZJOI2011]看电影(组合数学,高精度)

    [BZOJ2227][ZJOI2011]看电影(组合数学,高精度) 题面 BZOJ 洛谷 题解 这题太神仙了. 首先\(K<N\)则必定无解,直接特判解决. 现在只考虑\(K\ge N\)的情况 ...

  9. UESTC 2015dp专题 F 邱老师看电影 概率dp

    邱老师看电影 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/65 Descr ...

  10. 我追一个处女座的女孩快两个月了,我之前聊得很好,她说过有空call我去看电影,过了一个月她就不理我了,我喜欢她, 我是程序员,百度发不了那么多字。

    她刚刚进公司的时候,公司组织去打球,我叫她一起去她也去了,我和她聊了很多,聊得很自然,很开心,如我是哪个学习毕业的 我出来工作多久了等,她也聊了 她自己好多,她现在在读大学,只有周日上一天课那种. 我 ...

随机推荐

  1. sorted、返回函数、匿名函数、装饰器、偏函数

    1.sorted()排序方法,它可已经一个列表按照升序排序,也可以按照反序排序 1)如果要进行反序排序时,需要在函数里面设置reverse = True 2)sorted是一个高阶函数,它接受函数作为 ...

  2. python:模拟购票的小程序

    问题描述:小白学习python的第N天,继续练习.做一个模拟购票的小程序,没有用数据库和文件来存储数据,只是能够单词选择. # hzh 每天进步一点点 # 2022/5/13 17:24 import ...

  3. JUC(八)ThreadLocal

    ThreadLocal 简介 ThreadLocal提供局部线程变量,这个变量与普通的变量不同,每个线程在访问ThreadLocal实例的时候,(通过get或者set方法)都有自己的.独立初始化变量副 ...

  4. Linux(二)文件权限和压缩

    1 搜索查找类 1.1 查找定位文件 find <搜索范围.路径> <选项> find将从指定目录下递归地遍历其各个子目录,将满足条件的文件显示在终端. 选项说明 -name: ...

  5. MAPPO学习笔记(1):从PPO算法开始

    由于这段时间的学习内容涉及到MAPPO算法,并且我对MAPPO算法这种多智能体算法的信息交互机制不甚了解,于是写了这个系列的笔记,目的是巩固知识,并且进行一些粗浅又滑稽的总结. 1.PPO算法的介绍 ...

  6. maven下载和配置信息

    1. 下载maven: https://maven.apache.org/ 2. 进入官网点击 Download 3. 最新版直接下载 .tar.gz 格式linux系统 .zip windows系统 ...

  7. Html 设置标题栏顶部固定

    如何设置标题栏一直置顶固定显示? 只需要给标题栏所在的容器,以下设置:   position: fixed;   top: 0px;   left: 0px;   width: 100%; 位置固定在 ...

  8. lombok版本报错问题java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor (in unnamed module

    lombok版本报错问题 记录一个项目部署时遇到的问题,我本地采用的JDK8的版本,然后我的服务器采用的是JDK17,然后在用maven进行打包的时候,发现package失败. 复现 我在本地采用的l ...

  9. Azure Devops上模版化K8s部署

    在2022年我们终于完成了主要业务系统上K8s的计划,在这里总结下我们上K8s时候的模版工程. 前提条件 本文不讨论K8s是什么,什么是容器化,为什么需要容器化,什么是微服务等这些基础内容,这些到处说 ...

  10. 2022-08-10:为了给刷题的同学一些奖励,力扣团队引入了一个弹簧游戏机, 游戏机由 N 个特殊弹簧排成一排,编号为 0 到 N-1, 初始有一个小球在编号 0 的弹簧处。若小球在编号为 i 的弹

    2022-08-10:为了给刷题的同学一些奖励,力扣团队引入了一个弹簧游戏机, 游戏机由 N 个特殊弹簧排成一排,编号为 0 到 N-1, 初始有一个小球在编号 0 的弹簧处.若小球在编号为 i 的弹 ...