P8548 小挖的买花 方法记录
小挖的买花
题目背景
小挖喜欢买花,但是 ta 太懒了!所以这个任务全权交给了你。
题目描述
花店里只有 \(n\) 株花,每一株花都有三个属性:价格 \(cost_i\)、美丽度 \(be_i\)、新鲜程度 \(fr_i\)。
小挖每次都有不同的要求。准确来说,对于第 \(j\) 次买花,你手里的钱至多能买下总价为 \(c_j\) 的花。同时,小挖还要求购买花的新鲜程度总和大于等于 \(f_j\)。而小挖希望知道,在满足 ta 给出的条件后,购买花的美丽度总和的最大值是多少?
小挖一共要让你买 \(q\) 次花,你能否正确回答 ta 的问题呢?
询问显然彼此独立。
输入格式
第 \(1\) 行,共两个数 \(n,q\) 。
第 \(2\sim n+1\) 行,每行三个数 \(cost_i,fr_i,be_i\),分别表示一株花的三个属性。
第 \(n+2\sim n+q+1\) 行,每行两个数 \(c_j,f_j\) ,表示每次买花时的要求。
输出格式
共 \(q\) 行,每行一个数,表示美丽度总和的最大值。
样例 #1
样例输入 #1
5 1
2 4 5
4 3 3
1 3 2
3 4 3
3 2 5
10 10
样例输出 #1
15
提示
对于 \(20\%\) 的数据,\(3\leq n,q\leq 16\)。
对于 \(40\%\) 的数据,\(3\leq n,q\leq 30,0\leq c_j,f_j\leq 50\)。
对于 \(60\%\) 的数据,\(3\leq n\leq 100,1\leq q\leq 5\times 10^4,0\leq cost_i,fr_i,c_j,f_j\leq 100\)。
对于另外 \(20\%\) 的数据,对于每次买花,都有 \(f_j=0\)。
对于 \(100\%\) 的数据,\(3\leq n\leq 500,\boldsymbol{1\leq q\leq 10^6},0\leq cost_i,fr_i,c_j,f_j\leq 500, 1\leq be_i \leq 10^6\)。
审题
第一眼看到“费用”,“新鲜度”这两个指标,像极了二维费用的背包问题。不由得想到二维背包的经典例题:潜水员
但是本题和潜水员又有差别。因为潜水员一题中,两种付出代价的要求都是“至少”,即氧气、氮气都不能低于某一下限。而本题的特殊之处在于,指标“价格”要求不能超过上限,指标“新鲜度”不能低于下限。
思路
我们还是借用常规思想,用\(dp[i][j]\)来表示花费\(i\)的费用,在新鲜度为\(j\)的情况下,能获得的最大美丽度。
状态转移方程
1.初始化:\(dp[i][j]=0\)
2.设计循环:
for(i=1~n,i++)//遍历花的种类
for(j=c~cost[i],j--)//遍历价格
for(k=f~0,k--)//遍历新鲜度
3.设计转移方程:
(1)若当前状态的新鲜度可以用第\(i\)种花卉直接满足,即\(k<=fr[i]\),则\(dp[j][k]=maxx(dp[j-cost[i]][0]+be[i],dp[j][k])\)
(2)若当前状态由上一个状态+第\(i\)种花卉转移过来,即\(dp[j-cost[i]][k-fr[i]]!=0\),则\(dp[j][k]=maxx(dp[j][k],dp[j-cost[i]][k-fr[i]]+be[i])\)
if(k<=fr[i])
{
dp[j][k]=maxx(dp[j-cost[i]][0]+be[i],dp[j][k]);
}
else if(dp[j-cost[i]][k-fr[i]])
{
dp[j][k]=maxx(dp[j][k],dp[j-cost[i]][k-fr[i]]+be[i]);
}
4.优化:
题目中有一句话:“询问显然彼此独立”,那是不是意味着我们需要每一组询问都跑一遍\(dp\)呢?显然不是的。
我们可以统计出所有询问中最大的\(c\),记作\(maxc\);统计出最大的\(f\),记作\(maxf\)。
我们只需要跑一次\(dp\),得到\(dp[maxc][maxf]\)的结果。试想一下,若\(dp[maxc][maxf]\)跑出来了,那么\(dp[1][1],dp[1][2]...dp[i][j]...dp[maxc][maxf]\)的结果不就都出来了吗~
AC代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
template <typename T>inline void re(T &x) {
x=0;
int f=1;
char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-f;
for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(c^48);
x*=f;
return;
}
template <typename T>void wr(T x) {
if(x<0) putchar('-'),x=-x;
if(x>9) wr(x/10);
putchar(x%10^'0');
return;
}
int maxx(int a,int b)
{
return a>b?a:b;
}
const int N=505;
int n,q;
int dp[N][N];
int cost[N],fr[N],be[N];
signed main()
{
re(n);re(q);
for(int i=1;i<=n;++i)
{
re(cost[i]);re(fr[i]);re(be[i]);
}
for(int x=1;x<=q;++x)
{
memset(dp,0,sizeof(dp));
int c,f;
re(c);re(f);
for(int i=1;i<=n;++i)
for(int j=c;j>=cost[i];j--)
for(int k=f;k>=0;k--)
{
if(k<=fr[i])
{
dp[j][k]=maxx(dp[j-cost[i]][0]+be[i],dp[j][k]);
}
else if(dp[j-cost[i]][k-fr[i]])
{
dp[j][k]=maxx(dp[j][k],dp[j-cost[i]][k-fr[i]]+be[i]);
}
}
printf("%d\n",dp[c][f]);
}
return 0;
}
P8548 小挖的买花 方法记录的更多相关文章
- EF里查看/修改实体的当前值、原始值和数据库值以及重写SaveChanges方法记录实体状态
本文目录 查看实体当前.原始和数据库值:DbEntityEntry 查看实体的某个属性值:GetValue<TValue>方法 拷贝DbPropertyValues到实体:ToObject ...
- 64位 SQL Server2008链接访问Oracle 过程汇总解决方法记录
64位 SQL Server2008链接访问Oracle 过程汇总解决方法记录 经过几天不停的网上找资料,实验,终于联通了. 环境:系统:win 2008 ,SqlServer2008 R2, 连接O ...
- 微信小程序数据请求方法wx.request小测试
微信小程序数据请求方法 wx.request wxml文件: <view> <textarea value="{{textdata}}"/> </vi ...
- js实用方法记录-js动态加载css、js脚本文件
js实用方法记录-动态加载css/js 附送一个加载iframe,h5打开app代码 1. 动态加载js文件到head标签并执行回调 方法调用:dynamicLoadJs('http://www.yi ...
- js实用方法记录-简单cookie操作
js实用方法记录-简单cookie操作 设置cookie:setCookie(名称,值,保存时间,保存域); 获取cookie:setCookie(名称); 移除cookie:setCookie(名称 ...
- win10 系统右键菜单不显示文字(只有小图标)修复方法
如下图,win10点击鼠标右键调出菜单时,看不到菜单的文字,只显示了小图标. 解决方法: Cortana 搜索 cmd ,看到 命令提示符,右键,选择 以管理员身份运行. 在命令提示符里输入以下命令, ...
- js实用方法记录-指不定哪天就会用到的js方法
js实用方法记录-指不定哪天就会用到的js方法 常用或者不常用都有 判断是否在微信浏览器中 测试代码:isWeiXin()==false /** * 是否在微信中 */ function isWeix ...
- rt-thread中动态内存分配之小内存管理模块方法的一点理解
@2019-01-18 [小记] rt-thread中动态内存分配之小内存管理模块方法的一点理解 > 内存初始化后的布局示意 lfree指向内存空闲区首地址 /** * @ingroup Sys ...
- easyui toopTip,鼠标划过悬浮,显示一个小提示框的方法
easyui toopTip,鼠标划过悬浮,显示一个小提示框的方法 /*easyui,鼠标划过悬浮,显示一个小提示框的方法*/ function toopTip(idOrClass,showText) ...
随机推荐
- typescript中的--strictFunctionTypes选项
什么是协变和逆变 原来,在泛型参数上添加了in关键字作为泛型修饰符的话,那么那个泛型参数就只能用作方法的输入参数,或者只写属性的参数,不能作为方法返回值等,总之就是只能是"入",不 ...
- Go语言基础二:常用的Go工具命令
常用的Go工具命令 Go附带了一下有用的命令,这些命令可以简化开发的过程.命令通常包含的IDE中,从而使工具在整个开发环境中保持一致. go run 命令 go run命令实在开发过程中执行的最常见的 ...
- 国产钡铼分布式IO模块如何与西门子PLC Profinet通讯
1.准备IO模块:耦合器BL200PN.数字量输出模块M2082.数字量输入M1081.模拟量输入模块M3401.模拟量输出M4043. 编辑搜图 请点击输入图片描述(最多18字) 2.BL200P ...
- Java中类成员访问权限修饰符(public、protected、default、private)
1.public(公共的): 任何类都可以进行访问(最不严格). 2.protected(保护的): 同一包内的类以及其子类可以进行访问. 3.default(缺省的): 类中不加任何访问权限限定的成 ...
- CMAKE编译时如何自动下载第三方库并解压、安装到指定目录
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 导语 在日常开发过程中难免会使用到第三方库或者需要将部分库分离另外存储,如果将库与代码放在一起难免会造成工程庞大,此时就可 ...
- LuoguP2876 [USACO07JAN]解决问题Problem Solving (区间DP)(未完成)
#include "Head.cpp" const int N = 307; int f[N][N], a[N], b[N], sumA[N], sumB[N]; int main ...
- 无情摆烂我竟是cv怪物第四周周末总结
无情摆烂我竟是cv怪物第四周周末总结 函数重要参数补充 1.*args 星号代表接收未被位置形参接收的额外的位置实参,无论有多少位置实参*args都可以将它全部接受 def func(*args): ...
- [HNOI2011]卡农 (数论计数,DP)
题面 原题面 众所周知卡农是一种复调音乐的写作技法,小余在听卡农音乐时灵感大发,发明了一种新的音乐谱写规则. 他将声音分成 n n n 个音阶,并将音乐分成若干个片段.音乐的每个片段都是由 1 1 1 ...
- IDEA 修改注释的颜色
- 【2022-09-09】Django框架(九)
Django框架(九) cookie与session简介 网址的发展史: 1.起初网站都没有保存用户功能的需求,所有用户访问返回的结果都是一样的. 比如:新闻网页,博客网页,小说... (这些网页是不 ...