[BZOJ2667][cqoi2012]模拟工厂

试题描述

有一个称为“模拟工厂”的游戏是这样的:在时刻0,工厂的生产力等于1。在每个时刻,你可以提高生产力或者生产商品。如果选择提高生产力,在下一个时刻时工厂的生产力加1;如果选择生产商品,则下一个时刻你所拥有的商品数量增加p,其中p是本时刻工厂的生产力。
n个订单,可以选择接受或者不接受。第i个订单(tigimi)要求在时刻ti给买家提供gi个商品,事成之后商品数量减少gi,而收入增加mi元。如果接受订单i,则必须恰好在时刻ti交易,不能早也不能晚。同一时刻可以接受多个订单,但每个订单只能被接受一次。要求最后的总收入最大。
例如,如果一共有两个订单(5,1,8)和(7,15,3),用如下策略是最优的:时刻0, 1, 2提高生产力(时刻3的生产力为4),然后在时刻3,4生产商品,则在时刻5时将拥有8个商品。此时接受第1个订单(还会剩下7个商品),并且在时刻5,6继续生产商品,则在时刻7时拥有7+4+4=15个商品,正好满足订单2。

输入

输入第一行包含一个整数n,即订单数目。以下n行每行三个整数tigimi

输出

输出仅一行,为最大总收入。输出保证在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]模拟工厂的更多相关文章

  1. [BZOJ2667][cqoi2012]模拟工厂 贪心

    2667: [cqoi2012]模拟工厂 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 367  Solved: 184[Submit][Status] ...

  2. [CQOI2012]模拟工厂 题解(搜索+贪心)

    [CQOI2012]模拟工厂 题解(搜索+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327574 链接题目地址:洛谷P3161 BZOJ P26 ...

  3. P3161 [CQOI2012]模拟工厂

    传送门 先枚举选择哪些订单,然后转为判定是否可行 在能完成的情况下肯定是花越多时间提高生产力越优 我们设可以有\(x\)单位时间来提高生产力,那么如果当前离下一个订单的时间为\(T\)时,这个订单要\ ...

  4. 洛谷 题解 P3161 【[CQOI2012]模拟工厂】

    本蒟蒻又双叒叕被爆踩辣! 题目链接 Solution: 这题又是一道贪心.. 数据范围: n<=15 ti<=100,000 gi<=10^9 mi<=10^9 这里就可以看到 ...

  5. LUOGU P3161 [CQOI2012]模拟工厂 (贪心)

    传送门 解题思路 贪心,首先因为\(n\)比较小,可以\(2^n\)枚举子集.然后判断的时候就每次看后面的如果用最大生产力生产能不能达成目标,解一个二次函数. 代码 #include<iostr ...

  6. [BZOJ2667][cqoi2012][kcoj]模拟工厂

    题目描述 Description 有一个称为“模拟工厂”的游戏是这样的:在时刻0,工厂的生产力等于1.在每个时刻,你可以提高生产力或者生产商品.如果选择提高生产力,在下一个时刻时工厂的生产力加1:如果 ...

  7. 贪心(qwq)习题题解

    贪心(qwq)习题题解 SCOI 题解 [ SCOI2016 美味 ] 假设已经确定了前i位,那么答案ans一定属于一个区间. 从高位往低位贪心,每次区间查找是否存在使此位答案为1的值. 比如6位数确 ...

  8. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  9. python mock基本使用

    什么是mock? mock在翻译过来有模拟的意思.这里要介绍的mock是辅助单元测试的一个模块.它允许您用模拟对象替换您的系统的部分,并对它们已使用的方式进行断言. 在Python2.x 中 mock ...

随机推荐

  1. MyEclipse中Tomcat对应JVM的参数配置

    MyEclipse中Tomcat对应JVM的参数配置: -Xmx512M -Xms256M -XX:MaxPermSize=256m

  2. 转 Docker Swarm vs Kubernetes

    容器化已经改变我们部署软件和微服务开发的方式.如果你刚听说容器, 这篇博客帮你入门. 什么是容器编排 容器能够把服务打包成基本单元,你可以把它部署到任何地方:本地机器.测试环境或者生产系统.但是在生产 ...

  3. C#代码规范(简版)

    C#项目代码规范 目的 1.方便代码的交流和维护. 2.不影响编码的效率,不与大众习惯冲突. 3.使代码更美观.阅读更方便. 4.使代码的逻辑更清晰.更易于理解. 在C#中通常使用的两种编码方式如下 ...

  4. ERROR 1 (HY000): Can't create/write to file '/tmp/#sql_830_0.MYI' (Errcode: 13)

    mysql操作时,出现报错. 执行describe 命令时, 临时文件目录没有创建或者无写入权限:于是: cd /var/lib/mysql/ #进入mysql数据目录 mkdir tmp #创建需要 ...

  5. html5开发移动混合App系列2-开发环境搭建(windows)

    Java下载: http://www.oracle.com/technetwork/java/javase/downloads/index.html 环境变量: JAVA_HOME=C:\Progra ...

  6. Ubuntu14.04环境下java web运行环境搭建

    1.jdk安装 将下载好的安装包上传至/home目录解压 tar -zxvf jdk-8u71-linux-x64.tar.gz 执行 vim /etc/profile 在末尾添加java环境变量(J ...

  7. Ryubook_1_switch_hub_源码

    一.switching hub by openflow: 用Ryu实现一个有如下功能的switching hub. • Learns the MAC address of the host conne ...

  8. nodejs的学习

    nodejs 就是使用js来编写服务端的程序.它的特性是(单线程   速度快   耗内存多  异步   事件驱动) ( 一些技术的解决方案:默认情况下是 1.不支持多核,可以使用cluster 进行解 ...

  9. 去除inline-block间距

    去除inline-block间距 通过display:inline-block设置元素为水平时,相邻元素之间会有几px的间距: html: <ul class="list"& ...

  10. Java 类执行顺序

    1.如果父类有静态成员赋值或者静态初始化块,执行静态成员赋值和静态初始化块2.如果类有静态成员赋值或者静态初始化块,执行静态成员赋值和静态初始化块3.将类的成员赋予初值(原始类型的成员的值为规定值,例 ...