题目描述

  在比特镇一共有$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)的更多相关文章

  1. [CSP-S模拟测试]:B(DP+数学)

    题目传送门(内部题45) 输入格式 第一行$3$个整数$n,m,P$.第二行$m$个整数,表示$m$次询问. 输出格式 一行$m$个整数表示答案. 样例 样例输入1: 2 4 40 1 2 3 样例输 ...

  2. [CSP-S模拟测试]:蛇(DP+构造+哈希)

    题目传送门(内部题140) 输入格式 前两行有两个长度相同的字符串,描述林先森花园上的字母. 第三行一个字符串$S$. 输出格式 输出一行一个整数,表示有多少种可能的蛇,对$10^9+7$取模. 样例 ...

  3. [CSP-S模拟测试]:最小值(DP+乱搞)

    题目背景 $Maxtir$更喜欢序列的最小值. 题目传送门(内部题128) 输入格式 第一行输入一个正整数$n$和四个整数$A,B,C,D$. 第二行输入$n$个整数,第$i$个数表示$a_i$. 输 ...

  4. [CSP-S模拟测试]:花(DP)

    题目传送门(内部题111) 输入格式 一个整数$T$,表示测试数据组数. 每组测试数据占一行,两个整数,分别表示$L$和$S$. 输出格式 对每组数据,输出一个整数表示答案. 样例 样例输入1: 13 ...

  5. [CSP-S模拟测试]:计数(DP+记忆化搜索)

    题目描述 既然是萌萌哒$visit\text{_}world$的比赛,那必然会有一道计数题啦!考虑一个$N$个节点的二叉树,它的节点被标上了$1\sim N$的编号.并且,编号为$i$的节点在二叉树的 ...

  6. [CSP-S模拟测试]:matrix(DP)

    题目描述 求出满足以下条件的$n\times m$的$01$矩阵个数:(1)第$i$行第$1~l_i$列恰好有$1$个$1$.(2)第$i$行第$r_i~m$列恰好有$1$个$1$.(3)每列至多有$ ...

  7. [CSP-S模拟测试]:题(DP+数学)

    题目描述 出个题就好了.这就是出题人没有写题目背景的原因.你在平面直角坐标系上.你一开始位于$(0,0)$.每次可以在上/下/左/右四个方向中选一个走一步.即:从$(x,y)$走到$(x,y+1),( ...

  8. [CSP-S模拟测试]:题(DP)

    题目描述 由于出题人赶时间所以没办法编故事来作为背景.一开始有$n$个苹果,$m$个人依次来吃苹果,第$i$个人会尝试吃$u_i$或$v_i$号苹果,具体来说分三种情况.$\bullet 1.$两个苹 ...

  9. [CSP-S模拟测试]:y(DP+bitset)

    题目背景 $\frac{1}{4}$遇到了一道水题,叕完全不会做,于是去请教小$D$.小$D$懒得理$\frac{1}{4}$,直接就离开了.于是,$\frac{1}{4}$只好来问你,这道题是这样的 ...

随机推荐

  1. MySQL使用Navicat远程连接时报错1251

    1.报错信息 client does not support authentication protocol requested by server:consider upgrading MySQL ...

  2. python实现建立tcp通信

    实现代码如下: #tcp协议通信import socketclass TcpConnect: def get_tcp(self,ip,port,message): #实例化一个基于tcp的socket ...

  3. 极*Java速成教程 - (2)

    Java语言基础 Java的一切都是以对象为基础,对象是生是死的生命周期由虚拟机管理,但是在创生和消亡阶段,需要我们去管理这个类怎么生,怎么死.我们也以此为契机,慢慢接触Java的诸多细节和具体实现. ...

  4. jsp常问面试题集

    1.Servlet总结 在Java Web程序中,Servlet主要负责接收用户请求 HttpServletRequest,在doGet(),doPost()中做相应的处理,并将回应HttpServl ...

  5. java_第一年_JavaWeb(10)

    JavaWeb的两种开发模式 JSP+JavaBean框架:JavaBean负责封装数据.提供方法,JSP负责处理用户请求和显示数据:只能开发较为简单的业务: JSP+JavaBean+Servlet ...

  6. day16 django 笔记

    一 jQuery是什么? [1]   jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多 javascript高手加入其team. [2]   jQuery是继prototy ...

  7. Cocos2d-x的Android配置以及相关參考文档

    版权声明:版权声明:本文为博主原创文章.转载请附上博文链接! https://blog.csdn.net/ccf19881030/article/details/24141181     关于Win7 ...

  8. Nhbernate

    一.ORM1.对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术.2.ORM是通过使用描述对象和数据库之间映射的 ...

  9. 20191115PHP cookie登入实例

    首先是登入页面 <form action="" method="post"> <input type="text" nam ...

  10. 实现斐波那契数列之es5、es6

    es5实现斐波拉契函数数列: <script type="text/javascript"> function fibonacci(n) { var one = 1; ...