[BZOJ2667][cqoi2012]模拟工厂
[BZOJ2667][cqoi2012]模拟工厂
试题描述
输入
输出
输出仅一行,为最大总收入。输出保证在32位带符号整数范围内。
输入示例
输出示例
数据规模及约定
n ≤ 15,ti ≤ 105,gi ≤ 109,mi ≤ 109
题解
发现 n 很小,我们可以 2n 枚举。然后检验答案时贪心。
首先明确,一段时间内如果提高生产力和生产的时间分别固定,那么一定是先提高生产力然后再生产最优。
如果当前有 p 的生产能力,并且已经处理完了前 i-1 个任务,那么我们可以算出对于第 i~n 个任务,算出当前时间到该任务还有多长时间(令这个时间长度为 Ti),算出第 i 到该任务总共需要生产多少产品(令这个产品数为 Gi),那么设 x 为提高生产力所用的时间可以列出不等式 (x + p)(Ti - x) ≥ Gi(就是一个开口向下的抛物线在一条水平直线的上方的部分),显然这样一个不等式的解集是一个区间 [li, ri];那么现在有一个神奇的结论,取所有 ri 中最小的就是最优的方式,这个我也不知道怎么证。。。。。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <cmath>
using namespace std; int read() {
int x = 0, f = 1; char c = getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
return x * f;
} #define maxn 20
#define oo 2147483647
#define LL long long int n;
struct Ord {
int t;
LL g, m;
Ord() {}
Ord(int _1, LL _2, LL _3): t(_1), g(_2), m(_3) {}
bool operator < (const Ord& t) const { return this->t < t.t; }
} os[maxn], get[maxn], gt[maxn]; int getans(LL p, LL t, LL g) {
LL A = -1, B = t - p, C = t * p - g;
LL delta = B * B - 4.0 * A * C;
if(delta < 0) return -1;
double x = (-(double)B - sqrt((double)delta)) / (2.0 * A);
return (int)x;
} int main() {
n = read();
for(int i = 0; i < n; i++) {
int a = read(), b = read(), c = read();
os[i] = Ord(a, b, c);
} sort(os, os + n);
int all = (1 << n) - 1;
LL ans = 0;
for(int i = 0; i <= all; i++) {
int cnt = 0, ct = 0;
for(int j = 0; j < n; j++) if(i >> j & 1) get[++cnt] = os[j];
get[cnt+1].t = -1;
for(int j = 1; j <= cnt; j++)
if(get[j].t == get[j+1].t) get[j+1].g += get[j].g, get[j+1].m += get[j].m;
else gt[++ct] = get[j];
gt[0].t = 0;
int p = 1; LL pro = 0, sum = 0;
for(int j = 1; j <= ct; j++) {
int x = oo; LL G = 0;
for(int k = j; k <= ct; k++)
G += gt[k].g, x = min(x, getans(p, gt[k].t - gt[j-1].t, G - pro));
pro += ((LL)x + p) * (gt[j].t - gt[j-1].t - x) - gt[j].g;
if(x < 0){ sum = -1; break; }
sum += gt[j].m; p += x;
}
// printf("%lld\n", sum);
ans = max(ans, sum);
}
printf("%lld\n", ans); return 0;
}
[BZOJ2667][cqoi2012]模拟工厂的更多相关文章
- [BZOJ2667][cqoi2012]模拟工厂 贪心
2667: [cqoi2012]模拟工厂 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 367 Solved: 184[Submit][Status] ...
- [CQOI2012]模拟工厂 题解(搜索+贪心)
[CQOI2012]模拟工厂 题解(搜索+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327574 链接题目地址:洛谷P3161 BZOJ P26 ...
- P3161 [CQOI2012]模拟工厂
传送门 先枚举选择哪些订单,然后转为判定是否可行 在能完成的情况下肯定是花越多时间提高生产力越优 我们设可以有\(x\)单位时间来提高生产力,那么如果当前离下一个订单的时间为\(T\)时,这个订单要\ ...
- 洛谷 题解 P3161 【[CQOI2012]模拟工厂】
本蒟蒻又双叒叕被爆踩辣! 题目链接 Solution: 这题又是一道贪心.. 数据范围: n<=15 ti<=100,000 gi<=10^9 mi<=10^9 这里就可以看到 ...
- LUOGU P3161 [CQOI2012]模拟工厂 (贪心)
传送门 解题思路 贪心,首先因为\(n\)比较小,可以\(2^n\)枚举子集.然后判断的时候就每次看后面的如果用最大生产力生产能不能达成目标,解一个二次函数. 代码 #include<iostr ...
- [BZOJ2667][cqoi2012][kcoj]模拟工厂
题目描述 Description 有一个称为“模拟工厂”的游戏是这样的:在时刻0,工厂的生产力等于1.在每个时刻,你可以提高生产力或者生产商品.如果选择提高生产力,在下一个时刻时工厂的生产力加1:如果 ...
- 贪心(qwq)习题题解
贪心(qwq)习题题解 SCOI 题解 [ SCOI2016 美味 ] 假设已经确定了前i位,那么答案ans一定属于一个区间. 从高位往低位贪心,每次区间查找是否存在使此位答案为1的值. 比如6位数确 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- python mock基本使用
什么是mock? mock在翻译过来有模拟的意思.这里要介绍的mock是辅助单元测试的一个模块.它允许您用模拟对象替换您的系统的部分,并对它们已使用的方式进行断言. 在Python2.x 中 mock ...
随机推荐
- Kruskal HDOJ 4313 Matrix
题目传送门 题意:如何花最小的代价使得一棵树划分开且不含同类节点 分析:当一条边连接的左右集合同类点小于等于1,那么不用删除,将两个集合合并,要求最小代价,那么贪心思想将权值降序排序,删除后剩下的就是 ...
- 求N!尾数有多少个0。
方法一:假设N!=K*10M,K不能被10整除,那么N!尾数就有M个0.再对N!进行质因子分解:N!=2x*3y*5z...由于10=2*5,即每一对2和5相乘都可以得到1个0,所以M只与指数x.z有 ...
- 每天学点linux命令之locate 与 find 命令
定位某个文件的位置 方法一 sudo find / -name libGLEW.so.1.13 -type f 方法二 sudo updatedb && locate libopenc ...
- AJPFX关于StringBuffer类的总结
StringBuffer类一.字符串缓冲区,是一个容器.没有子类不能继承.特点:长度可变化:可操作多个数据类型:可通过toString()变成字符串.二.存储方法1.StringBuffer appe ...
- js控制页面跳转,清缓存,强制刷新页面
单看标题,必定满脸蒙13. 其实,想表达的仅仅是,在js中通过window.location.href控制页面跳转时,有时会跳转至缓存页面,并没有真正去请求要跳转的地址,导致页面数据未能及时加载刷新. ...
- iOS----创建静态库
静态库 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.根据源代码的公开情况,库可以分为2种类型 开源库 公开源代码,能看到具体实现 比如SDWebImage.AFNetworkin ...
- Windows之shortcut
System key combinations CTRL+ESC: Open Start menu ALT+TAB: Switch between open programs ALT+F4: Quit ...
- Java EE 目标
在大三上学期学习了Java se,只是简单的学习了语法,而且没有及时的复习巩固,语法知识已经忘了许多.在这个新学期,又有了Java EE这门课,书上的内容是从没学习过的新知识,只是在网站上看到过像Sp ...
- BEGIN - 开始一个事务块
SYNOPSIS BEGIN [ WORK | TRANSACTION ] DESCRIPTION 描述 BEGIN 初始化一个事务块, 也就是说所有 BEGIN 命令后的用户语句都将在一个事务里面执 ...
- C#委托与事件的关系(转载)
1.C#中的事件和委托的作用?事件代表一个组件能够被关注的一种信号,比如你的大肠会向你发出想拉屎的信号,你就可以接收到上厕所.委托是可以把一个过程封装成变量进行传递并且执行的对象,比如你上蹲坑和上坐马 ...