@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,率先就白给了一发。

最新文章

  1. DeepMind背后的人工智能:深度学习原理初探
  2. C#深入.NET平台的软件系统分层开发
  3. 迷你DVD管理器(Java版)
  4. chmod 权限777 是什么意思(Unix和Linux的各种操作系统下)
  5. mycat分布式mysql中间件(数据库切分概述)[转]
  6. 重燃你的PHP安全分析之火
  7. vim技巧:折叠快捷键
  8. python学习第一天 -安装配置及其输入输出
  9. C,C#,C++中&amp;&amp;和||,&amp;和|的联系和区别
  10. python3 re正则匹配数据获取案例
  11. 2017广东工业大学程序设计竞赛决赛 题解&amp;源码(A,数学解方程,B,贪心博弈,C,递归,D,水,E,贪心,面试题,F,贪心,枚举,LCA,G,dp,记忆化搜索,H,思维题)
  12. js中给easyUI年份,月份选择下拉框赋值
  13. Gitlab管理网页老是500错误?增加物理内存,增加cpu吧
  14. JavaScript 常见错误
  15. 八. Pandas的轴
  16. asp.net搭建mybatis开发环境
  17. 打造高可靠与高性能的React同构解决方案
  18. JS全局变量VAR和THIS--在函数内部,加var是局部变量,不加是全局变量
  19. Codeforces Round #257 (Div. 2) E题:Jzzhu and Apples 模拟
  20. java 颁发公钥 私钥 php js RSA 加密解密整合

热门文章

  1. 如何安放你的大文件,MongoDB GridFS可以帮助你
  2. logback如何配置springboot框架
  3. Java开发架构篇:领域驱动设计架构基于SpringCloud搭建微服务
  4. Centos慢慢长大(一)
  5. 4.4MSSQLServer常用版本介绍
  6. 小智的旅行(Bridge)51nod 提高组试题
  7. CVE-2016-3714-ImageMagick 漏洞利用
  8. 05 . Python入门值循环语句
  9. Spring boot Sample 005之spring-boot-profile
  10. Java实现 LeetCode 680 验证回文字符串 Ⅱ(暴力)