bzoj1855: [Scoi2010]股票交易
2015-11-30 10:47
148 查看
背包
感觉省选怎么会考这么简单的东西呢 无聊去网上搜了一下 发现原来正解是单调队列来优化呀
不过带个log问题也不大
感觉省选怎么会考这么简单的东西呢 无聊去网上搜了一下 发现原来正解是单调队列来优化呀
不过带个log问题也不大
#include<iostream> #include<algorithm> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> using namespace std; void setIO(const string& a) { freopen((a+".in").c_str(), "r", stdin); freopen((a+".out").c_str(), "w", stdout); } const int N = 2010, INF = 0x3f3f3f3f; int f , g ; template<typename Q> void maxit(Q& x, const Q& y) { if(x < y) x = y; } int main() { int n, maxp, w, ap, bp, as, bs; scanf("%d%d%d", &n, &maxp, &w); memset(f, -0x3f, sizeof f); f[1][0] = 0; for(int sum, ok, k, i = 1; i <= n; i++) { scanf("%d%d%d%d", &ap, &bp, &as, &bs); memcpy(g, f[i], sizeof g); int tmr = min(i + 1 + w, n + 1); for(ok = 1, sum = 0, k = 1; ok; k <<= 1) { if(sum + k <= as) sum += k; else k = as - sum, ok = 0; for(int j = maxp; j >= 0; j--) if(g[j] > -INF) {// buy if(j + k <= maxp) maxit(g[j + k], g[j] - ap * k); } } // memcpy(g, f[i], sizeof g); for(ok = 1, sum = 0, k = 1; ok; k <<= 1) { if(sum + k <= bs) sum += k; else k = bs - sum, ok = 0; for(int j = 0; j <= maxp; j++) if(g[j] > -INF) {// sell if(j - k >= 0) maxit(g[j - k], g[j] + bp * k); } } for(int j = 0; j <= maxp; j++) { maxit(f[i + 1][j], f[i][j]); maxit(f[tmr][j], g[j]); } } int ans = 0; for(int i = 0; i <= maxp; i++) ans = max(ans, f[n + 1][i]); printf("%d\n", ans); return 0; }
相关文章推荐
- [转]Java中怎样判断一个字符串能否转成数字
- 各种HTTPS站点的SSL证书 ,扩展SSL证书,密钥交换和身份验证机制汇总
- IOS学习之 网络编程(2)--GET请求和POST请求
- TextView属性
- GO比较容易混淆的地方
- javascript 实现两个标准时间差几天
- 谈谈LOADRUNNER中PACING的设置
- ubuntu14.04下chrome浏览器的安装
- linux内核参数优化
- 使用Homebrew编译iOS linphone SDK
- 递推和递归
- 汉诺塔算法的递归与非递归的C以及C++源代码
- 程序员的工作汇报与总结方法
- 支线任务-5
- bzoj1854: [Scoi2010]游戏
- gpio 灯的对应关系
- easyui-panel
- 如何用好Google、百度等搜索引擎
- javascript作用域链(Scope Chain)用法实例解析
- 生命赋予我们每个人能力,无论多么疲倦或被践踏过,我们都可以找到感恩的理由。