[NOI 2017]蔬菜
Description
小 N 是蔬菜仓库的管理员,负责设计蔬菜的销售方案。
在蔬菜仓库中,共存放有 \(n\) 种蔬菜,小 N 需要根据不同蔬菜的特性,综合考虑各方面因素,设计合理的销售方案,以获得最多的收益。
在计算销售蔬菜的收益时,每销售一个单位第 \(i\) 种蔬菜,就可以获得 \(a_i\) 的收益。
特别地,由于政策鼓励商家进行多样化销售,第一次销售第 i 种蔬菜时,还会额外得到 \(s_i\) 的额外收益。
在经营开始时,第 \(i\) 种蔬菜的库存为 \(c_i\) 个单位。
然而,蔬菜的保鲜时间非常有限,一旦变质就不能进行销售,不过聪明的小 N 已经计算出了每个单位蔬菜变质的时间:对于第 \(i\) 种蔬菜,存在保鲜值 \(x_i\) ,每天结束时会有 \(x_i\) 个单位的蔬菜变质,直到所有蔬菜都变质。(注意:每一单位蔬菜的变质时间是固定的,不随销售发生变化)
形式化地:对于所有的满足条件 \(d \times x_i \leqslant ci\) 的正整数 \(d\) ,有 \(x_i\) 个单位的蔬菜将在第 \(d\) 天结束时变质。
特别地,若 \((d - 1) \times x_i \leqslant c_i \leqslant d \times x_i\) ,则有 \(c_i - (d - 1) \times x_i\) 单位的蔬菜将在第 \(d\) 天结束时变质。
注意,当 \(x_i = 0\) 时,意味着这种蔬菜不会变质。
同时,每天销售的蔬菜总量也是有限的,最多不能超过 \(m\) 个单位。
现在,小 N 有 \(k\) 个问题,想请你帮忙算一算。每个问题的形式都是:对于已知的 \(p_j\) ,如果需要销售 \(p_j\) 天,最多能获得多少收益?
\(1\leq n,k,p_i\leq 100000,1\leq m\leq 10,0<a_i,c_i\leq 10^9,0\leq s_i,x_i\leq 10^9\)
Solution
可以倒着做,从后往前贪。我们先计算 \(p=maxp=100000\) 。
由于有额外收益,我们可以将一个蔬菜分成前 \(c_i-1\) 个 \(a_i\) ,最后 \(1\) 个 \(a_i+s_i\) 。
这样题目模型就从蔬菜坏掉转化为了一个“进货”操作。
优先队列来解决。
考虑如何求其余的 \(p\) 。我们同样倒推。
因为前 \(p\) 天推到前 \(p-1\) 天时第 \(p\) 天买的一定能够在前 \(p-1\) 天买。所以同样开一个小根堆,控制堆的大小只有 \(mp\) 即可。
Code
#include <bits/stdc++.h>
#define pb push_back
#define ll long long
using namespace std;
const int N = 100000+5, MAXP = 100000;
int n, m, k, a[N], s[N], c[N], x[N], used[N], p;
vector<int> veg[N];
vector<int>::iterator it;
struct node {
int val, id;
bool operator < (const node &b) const {return val < b.val; }
} t;
priority_queue<node> Q;
priority_queue<int, vector<int>, greater<int> > PQ;
queue<int> P;
ll tol, ans[N];
void work() {
scanf("%d%d%d", &n, &m, &k);
for (int i = 1; i <= n; i++) scanf("%d%d%d%d", &a[i], &s[i], &c[i], &x[i]);
for (int i = 1; i <= n; i++) {
if (x[i] == 0) veg[MAXP].pb(i);
else veg[min(MAXP, (c[i]+x[i]-1)/x[i])].pb(i);
}
for (int i = MAXP; i >= 1; i--) {
for (it = veg[i].begin(); it != veg[i].end(); it++)
Q.push((node){a[*it]+s[*it], *it});
for (int lim = m; lim && !Q.empty(); --lim, Q.pop()) {
t = Q.top();
if (used[t.id] == 0) {
tol += t.val; ++used[t.id], PQ.push(t.val);
Q.push((node){a[t.id], t.id});
}else {
if (c[t.id]-1ll*x[t.id]*(i-1) > used[t.id]) {
tol += t.val; ++used[t.id], PQ.push(t.val);
Q.push((node){a[t.id], t.id});
}else P.push(t.id), ++lim;
}
}
while (!P.empty()) {
int u = P.front(); P.pop();
if (used[u] != c[u]) Q.push((node){a[u], u});
}
}
ans[MAXP] = tol;
for (int i = MAXP-1; i >= 1; i--) {
while (PQ.size() > 1ll*i*m) tol -= PQ.top(), PQ.pop();
ans[i] = tol;
}
while (k--) {scanf("%d", &p); printf("%lld\n", ans[p]); }
}
int main() {work(); return 0; }
[NOI 2017]蔬菜的更多相关文章
- NOI 2017滚粗退役记
NOI 2017 游记 又到了OIer退役了的季节 Day -1 今天是报到日. 中午11点多的动车.动车上和dick32165401和runzhe2000谈笑风生.顺便用dick32165401的流 ...
- NOI 2017 整数(线段树)
题意 https://loj.ac/problem/2302 思路 拆分成每个二进制位的加减来考虑,维护那个整数的二进制位.不难发现,进位就是找右边第一个 \(0\) 的位置,并将其赋值为 \(1\) ...
- [NOI 2017]整数
Description 题库链接 P 博士将他的计算任务抽象为对一个整数的操作. 具体来说,有一个整数 \(x\) ,一开始为 \(0\) . 接下来有 \(n\) 个操作,每个操作都是以下两种类型中 ...
- [NOI 2017]游戏
Description 题库链接 小 L 计划进行 \(n\) 场游戏,每场游戏使用一张地图,小 L 会选择一辆车在该地图上完成游戏. 小 L 的赛车有三辆,分别用大写字母 A.B.C 表示.地图一共 ...
- [NOI 2017]蚯蚓排队
Description 题库链接 蚯蚓幼儿园有 \(n\) 只蚯蚓.幼儿园园长神刀手为了管理方便,时常让这些蚯蚓们列队表演. 所有蚯蚓用从 \(1\) 到 \(n\) 的连续正整数编号.每只蚯蚓的长度 ...
- NOI 2017 Day1 题解
被虐爆了... T1 整数 题目传送门 Description 有一个整数 \(x\),有 \(n\) 此操作,每次操作为以下两种情况: 给出 \(a,b\),将 \(x\) 加上 \(a\times ...
- (转)2-SAT小结
2-sat小结 原文作者:老K 原文传送门 2-sat是什么 一类问题是这样的: (两个符号的意思 \(\lor \ or,\land \ and\)) 有n个布尔变量,现在对它们做出限制,比如\(a ...
- NOI p 2017 TG游记
嗨小朋友们大家好 还记得我是谁吗 对了我就是为iot配音的演员 弹鸡鸡 今天呐我特别的要向长沙市的oier们 洛谷的oier们 还有cnblogs的oier们问声好 为什么呢 因为我们在2017年11 ...
- 【NOI】2017 蚯蚓排队(BZOJ 4943,LOJ 2303) 模拟+hash
[题目]#2303. 「NOI2017」蚯蚓排队 [题意]给定n条长度不超过6的蚯蚓,初始各自在一个队伍.m次操作:1.将i号蚯蚓和j号蚯蚓的队伍合并(保证i为队尾,j为队首).2.将i号蚯蚓和它后面 ...
随机推荐
- Calendar类常用需求方法
经常处理一些日期相关的信息,Calendar类是处理日期的常用类,写下几个方法,不用重复造轮子了. 1.求上一天,下一天的日期 Date now = new Date();Calendar c = C ...
- [uboot] (第四章)uboot流程——uboot编译流程
http://blog.csdn.net/ooonebook/article/details/53000893 以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为 ...
- FastJSON基础
对象的类型 json文本 json数组 json对象 java对象 类型的转换 json文本 转 json对象 JSON.parseObject(str) json文本 ...
- FJOI2018 部分题解
领导集团问题 考虑对每一个点暴力dpdpdp:fi,jf_{i,j}fi,j表示iii为根的子树选出来的点集最小值不小于jjj的点集元素个数最大值. 那么显然fi,j=∑max{fv,k≥j}+1 ...
- PC平台在Unity3D中播放硬盘ogg,mp3,wav文件
Unity3D PC平台本身是支持直接用www读取本地ogg,wav的,但是并不能读取byte[],字节数组格式,这对用习惯了bass,fmod的人来说有点不方便. 搜了一圈发现了一个C#的音频库叫N ...
- POJ2516K次费用流建图
Description: N个订单(每个订单订K种商品),M个供应商(每个供应商供应K种商品),K种商品,后N行,表示每一个订单的详细信息,后M行表示每个供应商供应的详细信息,后K 个N * M的矩阵 ...
- PB9.0连接sqlserver2008 R2
pb9不支持sql2000以上版本的数据库直连.因此要连接2000以上的版本必须用odbc. windows下的odbc管理器打开方式:窗体键+R 调出运行对话框 输入 odbcad32 确定弹出od ...
- windows 批处理语言学习
程序员应该根植于心的一个理念是:重复的工作交给代码.windows上的批处理脚本就是这种理念的体现. 批处理bat能做的事很多,自动配置vs工程中的代码依赖环境,调用其它程序处理数据.自动编译代码等等 ...
- 开源播放器 ijkplayer (二) :ijkplayer倍速变调问题解决方案
转载注明出处:http://www.cnblogs.com/renhui/p/6510872.html 之前使用IjkPlayer做播放器的使用的时候,在做倍速播放的时候,发现播放的声音音调明显变高了 ...
- 《机器学习实战(基于scikit-learn和TensorFlow)》第五章内容学习心得
本章在讲支持向量机(Support Vector Machine). 支持向量机,一个功能强大的机器学习模型,能够执行线性或非线性数据的分类.回归甚至异常值检测的任务.它适用于中小型数据集的分类. 线 ...