洛谷1417 烹调方案 dp 贪心
#洛谷 1417 dp
挺有趣的一道dp题目,看上去接近于0/1背包,但是考虑到取每个点时间不同会对最后结果产生影响,因此需要进行预处理
对于物品x和物品y,当时间为p时,先加x后加y的收益为
a[x]-(p+c[x])*b[x]+a[y]-(p+c[x]+c[y])*by
而先加y再加x的收益为
a[y]-(p+c[y])*b[y]+a[x]-(p+c[y]+c[x])*bx
化简这两个式子,不难发现对于x和y,如果满足
c[x]*b[y]<c[y]*b[x]
,那么x 一定优于 y
由以上推论即可得解,对于题目中所给的物品,将其按照以上顺序排序,在进行0/1背包,即可得解
#include <cstdio>
#include <cstring>
#include <algorithm>
const int maxn = 100000 + 100;
struct data {
long long ai, bi, ci;
};
data p[60];
long long dp[maxn];
int t, n;
bool cmp(data aa, data bb) {
return (aa.ci * bb.bi < aa.bi * bb.ci);
}
int main () {
scanf("%d %d", &t, &n);
for (int i = 1; i <= n; i++) scanf("%lld", &p[i].ai);
for (int i = 1; i <= n; i++) scanf("%lld", &p[i].bi);
for (int i = 1; i <= n; i++) scanf("%lld", &p[i].ci);
std :: sort(p + 1, p + n + 1, cmp);
for (int i = 1; i <= n; i++)
for (int j = t; j >= p[i].ci; j--)
dp[j] = std :: max(dp[j], dp[j - p[i].ci] + (p[i].ai - j * p[i].bi));
long long ans = 0;
for (int i = 1; i <= t; i++) ans = std :: max(ans, dp[i]);
printf("%lld", ans);
return 0;
}
当时做这题时想尝试多次贪心取最优值的办法,,然而,最后只得了30分,虽然尝试未成功,但是面对贪心题目时,这也不失为一种方法
附上乱搞代码
#include <cstdio>
#include <cstring>
#include <algorithm>
const int maxn = 50 + 10;
int T, n;
struct data {
int ai;
int bi;
int ci;
};
data p[maxn];
int dp[100000 + 10];
bool cmp1(data aa, data bb) {
return(aa.bi < bb.bi);
}
bool cmp2(data aa, data bb) {
return (aa.ci < bb.ci);
}
bool cmp3(data aa, data bb) {
return (aa.ai > bb.ai);
}
bool cmp4(data aa, data bb) {
return (aa.bi * aa.ci < bb.bi * bb.ci);
}
int main () {
scanf("%d %d", &T, &n);
for (int i = 1; i <= n; i++) scanf("%d", &p[i].ai);
for (int i = 1; i <= n; i++) scanf("%d", &p[i].bi);
for (int i = 1; i <= n; i++) scanf("%d", &p[i].ci);
int ans = 0;
for (int i = 1; i <= n; i++) {
for (int j = T; j >= p[i].ci; j--) {
dp[j] = std :: max(dp[j],dp[j - p[i].ci] + (p[i].ai - j * p[i].bi));
}
}
for (int i = 1; i <= T; i++) ans = std :: max(ans, dp[i]);
std :: sort(p + 1, p + n + 1, cmp1);
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n; i++) {
for (int j = T; j >= p[i].ci; j--) {
dp[j] = std :: max(dp[j],dp[j - p[i].ci] + (p[i].ai - j * p[i].bi));
}
}
for (int i = 1; i <= T; i++) ans = std :: max(ans, dp[i]);
std :: sort(p + 1, p + n + 1, cmp2);
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n; i++) {
for (int j = T; j >= p[i].ci; j--) {
dp[j] = std :: max(dp[j],dp[j - p[i].ci] + (p[i].ai - j * p[i].bi));
}
}
for (int i = 1; i <= T; i++) ans = std :: max(ans, dp[i]);
std :: sort(p + 1, p + n + 1, cmp3);
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n; i++) {
for (int j = T; j >= p[i].ci; j--) {
dp[j] = std :: max(dp[j],dp[j - p[i].ci] + (p[i].ai - j * p[i].bi));
}
}
for (int i = 1; i <= T; i++) ans = std :: max(ans, dp[i]);
std :: sort(p + 1, p + n + 1, cmp4);
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n; i++) {
for (int j = T; j >= p[i].ci; j--) {
dp[j] = std :: max(dp[j],dp[j - p[i].ci] + (p[i].ai - j * p[i].bi));
}
}
for (int i = 1; i <= T; i++) ans = std :: max(ans, dp[i]);
printf("%d", ans);
return 0;
}
洛谷1417 烹调方案 dp 贪心的更多相关文章
- [洛谷P1417 烹调方案]贪心+dp
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3211Dream City Time Limit: 1 Second ...
- 洛谷 P1417 烹调方案
题目背景 由于你的帮助,火星只遭受了最小的损失.但gw懒得重建家园了,就造了一艘飞船飞向遥远的earth星.不过飞船飞到一半,gw发现了一个很严重的问题:肚子饿了~ gw还是会做饭的,于是拿出了储藏的 ...
- 洛谷P1417 烹调方案
题目背景 由于你的帮助,火星只遭受了最小的损失.但gw懒得重建家园了,就造了一艘飞船飞向遥远的earth星.不过飞船飞到一半,gw发现了一个很严重的问题:肚子饿了~ gw还是会做饭的,于是拿出了储藏的 ...
- 洛谷P1417 烹调方案【dp】
题目:https://www.luogu.org/problemnew/show/P1417 题意: 一道菜有$a,b,c$三个值.烧一道菜的时间是$c$.得到的价值是,$a-t*b$其中$t$是菜完 ...
- 洛谷 P1417 烹调方案 (01背包拓展)
一看到这道题就是01背包 但是我注意到价值和当前的时间有关. 没有想太多,直接写,0分 然后发现输入方式不对-- 改了之后只有25分 我知道wa是因为时间会影响价值,但不知道怎么做. 后来看了题解,发 ...
- 洛谷 P1417 烹调方案 题解
题面 这道题是一道典型的排序dp a[i]−b[i]∗(t+c[i])+a[j]−b[j]∗(t+c[i]+c[j]) a[j]−b[j]∗(t+c[j])+a[i]−b[i]∗(t+c[i]+c[j ...
- 洛谷 P1417烹调方案
题目大意: 一共有n件食材,每件食材有三个属性,ai,bi和ci,如果在t时刻完成第i样食材则得到ai-t*bi的美味指数,用第i件食材做饭要花去ci的时间. 求最大美味指数之和. 分析: 显然的0/ ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- NOIP2017提高组Day2T2 宝藏 洛谷P3959 状压dp
原文链接https://www.cnblogs.com/zhouzhendong/p/9261079.html 题目传送门 - 洛谷P3959 题目传送门 - Vijos P2032 题意 给定一个 ...
随机推荐
- 使用SeaJS,require加载Jquery的时候总是为null
这个问题困扰了我两天,使用别人的例子.官网down下来的example都没有问题.但是放到自己项目里就 var $=require("jquery") 为null. 后来发现,jq ...
- [HTML 5] Styling with ARIA
See if you can do a better job styling this button using ARIA states. One huge benefit to styling wi ...
- 【Android 应用开发】Android 平台 HTTP网速測试 案例 API 分析
作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/25996817 工信部规定的网速測试标准 : 除普通网页測速 ...
- Struts2 的工作原理
Struts2 的工作原理: 1)client向server发出一个http请求.webserver对请求进行解析,假设在StrutsPrepareAndExecuteFilter的请求映射路径(在w ...
- 内存问题检测神器:Valgrind
Linux下内存问题检测神器:Valgrind 在写大型C/C++工程时难免会发生内存泄漏现象,系统编程中一个重要的方面就是有效地处理与内存相关的问题.你的工作越接近系统,你就需要面对越多的内存问题. ...
- [JavaEE]Spring配置文件总结
首先来看一个标准的Spring配置文件 applicationContext.xml <?xml version="1.0" encoding="UTF-8&quo ...
- 32.QT绘图
widget.h #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QPainter> #inclu ...
- 如何安装windows系统
前言:装系统有两种方式,一种是下载系统镜像文件后解压ios文件到除c盘以外其他盘都可(如原系统是win10系统,则可以直接右键加载,而不必解压),然后运行.exe文件就可以自动安装了.这种方法在新款电 ...
- windows下安装ImageMagick扩展
最近项目中需要用到图片的一些特殊处理——比如:根据用户请求生成任意尺寸的图像.经过一些资料的查找,最终选用了php_imagick.利用 ImageMagick,你可以根据web应用程序的需要动态生成 ...
- 图片词典 Picture Dictionary
图片词典/可视词典 Picture Dictionary 某些 APP 又有新功能可以加入了.