[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 ...
随机推荐
- (转)当margin-top、padding-top的值为百分比时是如何计算的?
本文链接:https://blog.csdn.net/qq_27437967/article/details/72625900问题:当margin-top.padding-top的值是百分比时,分别是 ...
- Django创建数据库常用字段及参数
Django创建数据库常用字段及参数 常用字段 1.models.AutoField 自增列= int(11) 如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列 ...
- linux centos 安装mongoDB
1.下载mongoDB 例如下载3.2.19 64位版本 https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.2.19.tgz ...
- 基于CentOS系统部署EPICS环境
1.虚拟机安装CentOS系统2.打开终端,以root账户登录3.进入/usr/local目录下,新建文件夹epics,并进入该文件夹4.在/usr/local/epics目录下,执行wget htt ...
- 二叉树的C++实现
这是去年的内容,之前放在github的一个被遗忘的reporsity里面,今天看到了就拿出来 #include<iostream> #include<string> using ...
- ABCD 谁是小偷
题目: 警察局抓了a,b,c,d 4名偷窃嫌疑犯,其中只有一人是小偷.审问中,a说:“我不是小偷.”b说:“c是小偷.”c说:“小偷肯定是d.”d说:“c在胡说.” 现在已经知道这四人中有三人说的是真 ...
- Flask与微信小程序登录(后端)
开发微信小程序时,接入小程序的授权登录可以快速实现用户注册登录的步骤,是快速建立用户体系的重要一步.这篇文章将介绍 python + flask + 微信小程序实现用户快速注册登录方案(本文主要进行后 ...
- 无法连接asp.net development server
我的电脑重装了,在此之前,是可以进行调试的.并且将该解决方案拷到其他机器上能正常打开.并且正常调试.今天刚打开项目调试就提示“无法连接asp.net development server”,后来发现是 ...
- 理解js异步编程
Promise 背景 javascript语言的一大特点就是单线程,在某个特定的时刻只有特定的代码能够被执行,并阻塞其它的代码,也就是说,同一个时间只能做一件事. 怎么做到异步编程?回调函数.直到no ...
- linux服务器上软件的安装
mysql数据库的安装 redis的安装 zookeeper的安装