[HG]Market 题解
题目描述
在比特镇一共有 \(n\) 家商店,编号依次为 \(1\) 到 \(n\)。
每家商店只会卖一种物品,其中第 \(i\) 家商店的物品单价为 \(c_i\),价值为 \(v_i\),且该商店开张的时间为 \(t_i\)。
\(Byteasar\) 计划进行 \(m\) 次购物,其中第 \(i\) 次购物的时间为 \(T_i\),预算为 \(M_i\)
每次购物的时候,\(Byteasar\) 会在每家商店购买最多一件物品,当然他也可以选择什么都不买
如果购物的时间早于商店开张的时间, 那么显然他无法在这家商店进行购物。
现在 \(Byteasar\) 想知道,对于每个计划,他最多能购入总价值多少的物品。请写一个程序,帮助 \(Byteasar\) 合理安排购物计划。
注意:每次所花金额不得超过预算,预算也不一定要花完,同时预算不能留给其它计划使用。
对于 \(100\%\) 的数据:
\(n, m \in [1,300]; c_i,M_i \in [1, 10^9]; vi,t_i,Ti \in [1,300]\)
观察数据发现不用开long long。
题解
显然因为\(c_i,M_i \leq 10^9\),不可能去做01背包。
那么我们离线排序处理询问,并按照时间递增的顺序DP。
每次对于一个物品,我们"倒做"01背包,即计算某个价值所需要的最小代价。
分析
考场一阵乱打,空间开小,\(20\)pts 滚粗。
后来还莫名奇妙的多动规了一次,导致变为 \(80\)pts 。
代码
#include <cstdio>
#include <algorithm>
using namespace std;
struct Mark{
int c, v, t;
bool operator < (const Mark &rhs) const {
return t < rhs.t;
}
} market[305];
struct Qry{
int t, m, id;
bool operator < (const Qry &rhs) const {
return t < rhs.t;
}
} qry[100005];
int g[90005];
int qans[100005];
inline void flush(int u){
for (int i = 90000; i >= market[u].c; --i){
if (g[i] > g[i - market[u].c] + market[u].v)
g[i] = g[i - market[u].c] + market[u].v;
}
for (int i = 90000; i >= 1; --i)
if (g[i] > g[i + 1]) g[i] = g[i + 1];
}
int main(){
int n, m; scanf("%d %d", &n, &m);
for (int i = 1; i <= n; ++i)
scanf("%d %d %d", &market[i].v, &market[i].c, &market[i].t);
sort(market + 1, market + n + 1);
for (int i = 1; i <= m; ++i){
int t, m; scanf("%d %d", &t, &m);
qry[i] = {t, m, i};
}
sort(qry + 1, qry + m + 1);
for (int i = 1; i <= 90004; ++i) g[i] = 1000000007;
for (int i = 1, pos = 1; i <= m; ++i){
for ( ; market[pos].t <= qry[i].t && pos <= n; ++pos)
flush(pos);
qans[qry[i].id] = upper_bound(g, g + 90001, qry[i].m) - g - 1;
}
for (int i = 1; i <= m; ++i)
printf("%d\n", qans[i]);
return 0;
}
[HG]Market 题解的更多相关文章
- [HG]walk 题解
前言 学长博客划水,抄题解,差评. 于是我来重新写一篇正常的题解,虽然解法跟标程不一样,但是复杂度是一样的. 题面 题目描述 在比特镇一共有\(n\)个街区,编号依次为\(1\)到\(n\),它们之间 ...
- [HG]AK 题解
前言 什么鬼畜玩意,扶我起来,我要用__int128,这辈子都不珂能用龟速乘的... 真香. 题解 我们知道这个模数是个神奇的东西 \(2305843008676823040 = 2^{29} \ti ...
- [HG]子树问题 题解
前言 模拟赛赛时SubtaskR3没开long long丢了20分. 题意简述 题目描述 对于一棵有根树(设其节点数为 \(n\) ,则节点编号从 \(1\) 至 \(n\) ),如果它满足所有非根节 ...
- [HG]走夜路 题解
前言 整个机房就我一个人在想动态规划. 想了半天发现一堆性质,结果由于DP中出现折线挂了. 题目描述 某NOIP普及组原题加强版. \(Jim\) 非常怕黑,他有一个手电筒,设手电筒的电量上限为 \( ...
- [HG]腿部挂件 题解
前言 暴力跑的比正解快. 以下暴力(循环展开+fread读入输出优化) #include<cstdio> #pragma GCC optimize(3, "Ofast" ...
- [HG]小G坐电梯 题解
C 小G坐电梯 题目描述 小G来到了著名的某大厦.大厦一共有n层,初始的时候小G在第 A 层. 小G特别想去B层小 M 的办公室看一看,然而因为安保原因,B层已经被封锁无法进入. 但是小G既然来了,就 ...
- [HG]钻石游戏diamond 题解
题面 钻石游戏(diamond) 问题描述: 一个\(M\)行\(N\)列的棋盘,里面放了\(M \times N\)个各种颜色的钻石. 每一次你可以选择任意两个相邻的颜色不同的钻石,进行交换.两个格 ...
- [HG]提高组 题解
首先很容易想到暴力DP 设状态f[i][j]表示当前放了第i个数,最大的数为j的方案数. 然后根据转移推出实际上是在下图走路的方案数 \[ \left( \left( \begin{matrix} x ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
随机推荐
- 在PostgreSQL中 pg_start_backup 做了什么?
# 在PostgreSQL中 pg_start_backup 做了什么?HM 2019-07-30 ## pg_start_backup 做一个备份开始标记,还做了一些其他的操作,下面进行探寻. * ...
- 尝试自己搭一个简单的typescript运行环境
开发typescript项目有一些现成的脚手架,比如:typescript-library-starter,它的配置齐全,更适合用在实际项目开发上.其实在学习阶段可以自己搭建一个简单的typescri ...
- Java switch case 语句
switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支. 语法 switch(expression){ case value : //语句 break; //可选 ca ...
- JMS消息通信服务
什么是Java消息服务 Java消息服务指的是两个应用程序之间进行异步通信的API,它为标准消息协议和消息服务提供了一组通用接口,包括创建.发送.读取消息等,用于支持JAVA应用程序开发.在J2EE中 ...
- Restful Api调用工具类
RestfulHttpClient.java package pres.lnk.utils; import com.fasterxml.jackson.databind.ObjectMapper; i ...
- Jenkins的安装配置及使用
一.以Jenkins在tomcat容器里运行的方式,jenkins的安装及安装时所涉及的JDK和tomcat的配置 1.首先下载tomcat, 2.下载Jenkins.war包,将war包放在tomc ...
- 用原生JS写省市二级联动
HTML代码 <select id="s1"> <option value="0">~请选择省份~</option> < ...
- Docker搭建Gitlab服务器
1.使用docker搜索gitlab镜像 docker search gitlab 2.下载镜像: docker pull docker.io/gitlab/gitlab-ce 3.查看docker镜 ...
- Fatal Error: Out of memory php内存溢出处理三种方法
有时候我们在运行php程序的时候会发现 Fatal Error: Out of memory 这样的提示,这有可能是程序中用到了大量了变量和对象,导致分配的内存不够用. 修改php.ini文件里的me ...
- FushionCharts
FushionCharts官网:http://www.fusioncharts.com/ 在线Demo:http://www.fusioncharts.com/free/demos/Blueprint ...