@loj - 6039@ 「雅礼集训 2017 Day5」珠宝
@description@
Miranda 准备去市里最有名的珠宝展览会,展览会有可以购买珠宝,但可惜的是只能现金支付,Miranda 十分纠结究竟要带多少的现金,假如现金带多了,就会比较危险,假如带少了,看到想买的右买不到。展览中总共有 N 种珠宝,每种珠宝都只有一个,对于第 i 种珠宝,它的售价为 Ci 万元,对 Miranda 的吸引力为 Vi。Miranda 总共可以从银行中取出 K 万元,现在她想知道,假如她最终带了 i 万元去展览会,她能买到的珠宝对她的吸引力最大可以是多少?
@solution@
就是个数据范围长得比较奇怪的背包。注意到就 Ci 比较小,所以考虑 Ci 相同的珠宝放在一起转移。
对于某些 Ci = p 的物品,类比多重背包的单调队列做法,我们每次一次性处理模 p 余数相同的 dp 状态。
如果 Vi 相同就是个多重背包,直接用单调队列。
如果 Vi 不相同,肯定先选择 Vi 比较大的。因为它的子问题是使用的单调队列,我们不妨猜想推广的问题有决策单调性。手动验证一下发现的确如此。
所以直接写个决策单调性即可。时间复杂度貌似是 O(K*C*log K),不过能跑过。
@accpeted code@
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
const int MAXC = 300;
const int MAXK = 50000;
const int MAXN = 1000000;
vector<int>v[MAXC + 5];
ll s[MAXN + 5], f[2][MAXK + 5];
int N, K, p, q, cnt;
void solve(int l, int r, int opl, int opr) {
if( l > r ) return ;
int m = (l + r) >> 1;
int le = max(opl, m - cnt), ri = min(opr, m);
int opm = le; ll mx = -1;
for(int i=le;i<=ri;i++)
if( mx < f[1][p*i + q] + s[m - i] )
mx = f[1][p*i + q] + s[m - i], opm = i;
f[0][p*m + q] = mx;
solve(l, m - 1, opl, opm);
solve(m + 1, r, opm, opr);
}
bool cmp(int x, int y) {return x > y;}
int main() {
scanf("%d%d", &N, &K);
for(int i=1;i<=N;i++) {
int C, V; scanf("%d%d", &C, &V);
v[C].push_back(V);
}
for(p=1;p<=MAXC;p++) {
if( !v[p].size() ) continue;
for(int i=0;i<=K;i++)
f[1][i] = f[0][i], f[0][i] = 0;
cnt = 0, sort(v[p].begin(), v[p].end(), cmp);
for(int i=0;i<v[p].size();i++)
cnt++, s[cnt] = s[cnt - 1] + v[p][i];
for(q=0;q<p;q++) {
int l = 0, r = (K - q) / p;
if( l <= r ) solve(l, r, l, r);
}
}
for(int i=1;i<=K;i++)
printf("%lld%c", f[0][i], i == K ? '\n' : ' ');
}
@details@
没开 long long,率先就白给了一发。
@loj - 6039@ 「雅礼集训 2017 Day5」珠宝的更多相关文章
- [LOJ#6039].「雅礼集训 2017 Day5」珠宝[决策单调性]
题意 题目链接 分析 注意到本题的 \(C\) 很小,考虑定义一个和 \(C\) 有关的状态. 记 \(f(x,j)\) 表示考虑到了价格为 \(x\) 的物品,一共花费了 \(j\) 元的最大收益. ...
- loj #6039 「雅礼集训 2017 Day5」珠宝 分组背包 决策单调性优化
LINK:珠宝 去年在某个oj上写过这道题 当时懵懂无知wa的不省人事 终于发现这个东西原来是有决策单调性的. 可以发现是一个01背包 但是过不了 冷静分析 01背包的复杂度有下界 如果过不了说明必然 ...
- LOJ#6038. 「雅礼集训 2017 Day5」远行(LCT)
题面 传送门 题解 要不是因为数组版的\(LCT\)跑得实在太慢我至于去学指针版的么--而且指针版的完全看不懂啊-- 首先有两个结论 1.与一个点距离最大的点为任意一条直径的两个端点之一 2.两棵树之 ...
- 【刷题】LOJ 6038 「雅礼集训 2017 Day5」远行
题目描述 Miranda 生活的城市有 \(N\) 个小镇,一开始小镇间没有任何道路连接.随着经济发现,小镇之间陆续建起了一些双向的道路但是由于经济不太发达,在建设过程中,会保证对于任意两个小镇,最多 ...
- loj#6040. 「雅礼集训 2017 Day5」矩阵(线性代数+递推)
题面 传送门 题解 我的线代学得跟屎一样看题解跟看天书一样所以不要指望这题我会写题解 这里 //minamoto #include<bits/stdc++.h> #define R reg ...
- loj#6038 「雅礼集训 2017 Day5」远行
分析 代码 #include<bits/stdc++.h> using namespace std; #define fi first #define se second #define ...
- LOJ#6038. 「雅礼集训 2017 Day5」远行 [LCT维护子树的直径]
树的直径一定是原联通块4个里的组合 1.LCT,维护树的直径,这题就做完了 2.直接倍增,lca啥的求求距离,也可以吧- // powered by c++11 // by Isaunoya #inc ...
- [loj6039]「雅礼集训 2017 Day5」珠宝 dp+决策单调性+分治
https://loj.ac/problem/6039 我们设dp[i][j]表示考虑所有价值小于等于i的物品,带了j块钱的最大吸引力. 对于ci相同的物品,我们一定是从大到小选k个物品,又发现最大的 ...
- 「雅礼集训 2017 Day5」珠宝
题目描述 Miranda 准备去市里最有名的珠宝展览会,展览会有可以购买珠宝,但可惜的是只能现金支付,Miranda 十分纠结究竟要带多少的现金,假如现金带多了,就会比较危险,假如带少了,看到想买的右 ...
随机推荐
- 王艳 201771010127《面向对象程序设计(java)》第十三周学习总结
一:理论部分. 1.事件处理基础. 1)事件源:能够产生事件的对象都可以成为事件源,如文本框.按钮等.一个事件源是一个能够注册监听器并向监听器发送事件对象的对象. 2)事件监听器:事件监听器对象接收事 ...
- 五、数据类型(1):整数&&带小数点的数
1.整数 int printf("%d",...); scanf("%d",&...); 2.带小数点的数 double printf("%f ...
- 干货!JNPF快速开发平台功能一览
JNPF,采用主流的两大技术Java/.Net开发,是一套低代码开发平台,可视化开发环境,有拖拽式的代码生成器,灵活的权限配置.SaaS服务,强大的接口对接,随心可变的工作流引擎,一站式开发多端使 ...
- [SD心灵鸡汤]003.每月一则 - 2015.07
乔布斯去世了,但他留给世人的财富却很多,值得每个人学习.他是个精力充沛魅力无限的家伙,同时也是一个很会鼓动人心的激励大师,甚至在他的平常对话中,经典的语句也常常脱口而出. 这里摘取了一些他的经典语录, ...
- 【补充说明】Gauge框架在JS中的简单应用
这里做一个总结 由于公司架构要用node来替代Java的部分服务,所以就研究了这个自动化测试框架:它可以很方便的测试我们的接口,而且还能使用断言[assert]来判断是否是我们预期的结果. 但是呢,由 ...
- hexo搭建个人网站及hexo+nginx部署个人网站
先放个配置好了 server { # 监听端口 listen ; # 监听ip 换成服务器公网IP server_name mr-lin.site; location / { root /web/my ...
- Vue父子组件传值以及父调子方法、子调父方法
稍微总结了一下Vue中父子间传值以及相互调方法的问题,非常基础.希望可以帮到你!先来个最常用的,直接上代码: 1.父传值给子组件 父组件: <template> <div> & ...
- 工业级CC1125模块有哪些优势?主要应用领域?
CC1125无线模块是基于 TI 的 CC1125无线收发芯片设计,是一款完整的.体积小巧的.低功耗的无线收发模块.是 TI Chipcon 推出的 ISM 频段高性能无线收发芯片之一,最大输出功率可 ...
- Java实现 LeetCode 695 岛屿的最大面积(DFS)
695. 岛屿的最大面积 给定一个包含了一些 0 和 1 的非空二维数组 grid . 一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相 ...
- Java实现 LeetCode 551 学生出勤记录 I(暴力大法好)
551. 学生出勤记录 I 给定一个字符串来代表一个学生的出勤记录,这个记录仅包含以下三个字符: 'A' : Absent,缺勤 'L' : Late,迟到 'P' : Present,到场 如果一个 ...