[CSP-S模拟测试]:Market(背包DP)
题目描述
在比特镇一共有$n$家商店,编号依次为$1$到$n$。每家商店只会卖一种物品,其中第$i$家商店的物品单价为$c_i$,价值为$v_i$,且该商店开张的时间为$t_i$。
$Byteasar$计划进行$m$次购物,其中第$i$次购物的时间为$T_i$,预算为$M_i$。每次购物的时候,$Byteasar$会在每家商店购买最多一件物品,当然他也可以选择什么都不买。如果购物的时间早于商店开张的时间,那么显然他无法在这家商店进行购物。
现在$Byteasar$想知道,对于每个计划,他最多能购入总价值多少的物品。请写一个程序,帮助$Byteasar$合理安排购物计划。
注意:每次所花金额不得超过预算,预算也不一定要花完,同时预算不能留给其它计划使用。
输入格式
第一行包含两个正整数$n,m$,表示商店的总数和计划购物的次数。
接下来$n$行,每行三个正整数$c_i,v_i,t_i$,分别表示每家商店的单价、价值以及开张时间。
接下来$m$行,每行两个正整数$T_i,M_i$,分别表示每个购物计划的时间和预算。
输出格式
输出$m$行,每行一个整数,对于每个计划输出最大可能的价值和。
样例
样例输入:
5 2
5 5 4
1 3 1
3 4 3
6 2 2
4 3 2
3 8
5 9
样例输出:
10
12
数据范围与提示
样例解释:
第一个计划可以在商店$2,3,5$各购买一件物品,总花费为$1+3+4=8$,总价值为$3+4+3=10$。
第二个计划可以在商店$1,2,3$各购买一件物品,总花费为$5+1+3=9$,总价值为$5+3+4=12$。
数据范围:
对于$100\%$的数据,$1\leqslant t_i,T_i\leqslant n$。
题解
对于正常的背包$DP$,我们都是设$dp[i][j]$表示选到第$i$个,背包空间为$j$所能获得的最大价值。
而对于这道题,背包空间很大,但是价值很小,所以我们不妨设$dp[i][j]$表示选到第$i$个,得到价值为$j$所消耗的最小背包空间。
对于时间,我们可以将物品和询问按时间排序,统一计算答案,然后在二分提取询问即可。
时间复杂度:$\Theta(n^2v+m\log m)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
- #include<bits/stdc++.h>
- using namespace std;
- struct rec{int c,v,t;}e[301];
- struct node{int t,m,id;}q[100001];
- int n,m;
- int dp[100000];
- int ans[100001];
- bool cmp1(rec a,rec b){return a.t<b.t;}
- bool cmp2(node a,node b){return a.t<b.t;}
- int main()
- {
- scanf("%d%d",&n,&m);
- for(int i=1;i<=n;i++)
- scanf("%d%d%d",&e[i].c,&e[i].v,&e[i].t);
- for(int i=1;i<=m;i++)
- {
- scanf("%d%d",&q[i].t,&q[i].m);
- q[i].id=i;
- }
- sort(e+1,e+n+1,cmp1);
- sort(q+1,q+m+1,cmp2);
- memset(dp,0x3f,sizeof(dp));
- dp[0]=0;
- int j=1;
- for(int i=1;i<=m;i++)
- {
- while(j<=n&&e[j].t<=q[i].t)
- {
- for(int k=n*300;k>=e[j].v;k--)
- dp[k]=min(dp[k],dp[k-e[j].v]+e[j].c);
- for(int k=n*300;k;k--)
- dp[k]=min(dp[k],dp[k+1]);
- j++;
- }
- ans[q[i].id]=upper_bound(dp+1,dp+n*300+1,q[i].m)-dp-1;
- }
- for(int i=1;i<=m;i++)
- printf("%d\n",ans[i]);
- return 0;
- }
rp++
[CSP-S模拟测试]:Market(背包DP)的更多相关文章
- [CSP-S模拟测试]:B(DP+数学)
题目传送门(内部题45) 输入格式 第一行$3$个整数$n,m,P$.第二行$m$个整数,表示$m$次询问. 输出格式 一行$m$个整数表示答案. 样例 样例输入1: 2 4 40 1 2 3 样例输 ...
- [CSP-S模拟测试]:蛇(DP+构造+哈希)
题目传送门(内部题140) 输入格式 前两行有两个长度相同的字符串,描述林先森花园上的字母. 第三行一个字符串$S$. 输出格式 输出一行一个整数,表示有多少种可能的蛇,对$10^9+7$取模. 样例 ...
- [CSP-S模拟测试]:最小值(DP+乱搞)
题目背景 $Maxtir$更喜欢序列的最小值. 题目传送门(内部题128) 输入格式 第一行输入一个正整数$n$和四个整数$A,B,C,D$. 第二行输入$n$个整数,第$i$个数表示$a_i$. 输 ...
- [CSP-S模拟测试]:花(DP)
题目传送门(内部题111) 输入格式 一个整数$T$,表示测试数据组数. 每组测试数据占一行,两个整数,分别表示$L$和$S$. 输出格式 对每组数据,输出一个整数表示答案. 样例 样例输入1: 13 ...
- [CSP-S模拟测试]:计数(DP+记忆化搜索)
题目描述 既然是萌萌哒$visit\text{_}world$的比赛,那必然会有一道计数题啦!考虑一个$N$个节点的二叉树,它的节点被标上了$1\sim N$的编号.并且,编号为$i$的节点在二叉树的 ...
- [CSP-S模拟测试]:matrix(DP)
题目描述 求出满足以下条件的$n\times m$的$01$矩阵个数:(1)第$i$行第$1~l_i$列恰好有$1$个$1$.(2)第$i$行第$r_i~m$列恰好有$1$个$1$.(3)每列至多有$ ...
- [CSP-S模拟测试]:题(DP+数学)
题目描述 出个题就好了.这就是出题人没有写题目背景的原因.你在平面直角坐标系上.你一开始位于$(0,0)$.每次可以在上/下/左/右四个方向中选一个走一步.即:从$(x,y)$走到$(x,y+1),( ...
- [CSP-S模拟测试]:题(DP)
题目描述 由于出题人赶时间所以没办法编故事来作为背景.一开始有$n$个苹果,$m$个人依次来吃苹果,第$i$个人会尝试吃$u_i$或$v_i$号苹果,具体来说分三种情况.$\bullet 1.$两个苹 ...
- [CSP-S模拟测试]:y(DP+bitset)
题目背景 $\frac{1}{4}$遇到了一道水题,叕完全不会做,于是去请教小$D$.小$D$懒得理$\frac{1}{4}$,直接就离开了.于是,$\frac{1}{4}$只好来问你,这道题是这样的 ...
随机推荐
- Iview 启动报错 TypeError [ERR_INVALID_CALLBACK]: Callback must be a function
解决 fs.write(fd, buf, 0, buf.length, 0, function(err, written, buffer) {}); 替换为 fs.write(fd, buf, 0, ...
- 聊聊NTLM认证协议
近期发现多家安全媒体发布NTLM协议漏洞的文章.他们越说越术语,越说越官方,如此这般下去,他们写出来到底给谁看?大雅就是俗,让我来一篇俗文.啥是NTLM呢?微软windows系统的用户账号存储密码哈希 ...
- SVN检出新项目
1.新建文件夹SourseCode -->打开SourseCode文件夹,右键空白处 ---> 选择SVN Checkout --选择URL of repository,选择Checkou ...
- ementUi rules表单验证 --》Wangqi
ElementUi rules表单验证 ElementUi 表单验证 工作中常用到的JS验证 可以在pattern中书写正则,并且配合elementUI进行表单验证. pattern 属性规定用于 ...
- jsp+servlet的简单实现
开发环境 tomcat7.0,MyEclipse 10 1.建一个简单的Web Project ,项目名jspServlet: 2.在src目录下建一个package ,为com.fandy.serv ...
- 20191105 《Spring5高级编程》笔记-【目录】
背景 开始时间:2019/09/18 21:30 Spring5高级编程 版次:2019-01-01(第5版) Spring5最新版本:5.1.9 CURRENT GA 官方文档 Spring Fra ...
- Linux 文件创建、插入、替换
创建文件 touch newfile.txt 插入字符串 echo "aaa" >>/newfile.txt 替换字符串 sed -i "s/aaa/ccc/ ...
- linux中常用的60个命令及作用详解
Linux 必学的 60 个命令 Linux 提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作.文件存取.目录操作.进程管理.文件权限设定等.所以,在 Linux 系统上工作离不开使用系统 ...
- hdu-1045.fire net(缩点 + 二分匹配)
Fire Net Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- JS正则的补充,与其他前端组件的使用(easUi、jqueryUi、bootstrap、)
1.JS 正则 test - 判断字符串是否符合规定的正则 rep = /\d+/; rep.test("asdfoiklfasdf89asdfasdf") # true rep ...