[BZOJ2667][cqoi2012][kcoj]模拟工厂
|
题目描述 Description
|
||||||||||||||||||||
|
有一个称为“模拟工厂”的游戏是这样的:在时刻0,工厂的生产力等于1。在每个时刻,你可以提高生产力或者生产商品。如果选择提高生产力,在下一个时刻时工厂的生产力加1;如果选择生产商品,则下一个时刻你所拥有的商品数量增加p,其中p是本时刻工厂的生产力。
有n个订单,可以选择接受或者不接受。第i个订单(ti, gi, mi)要求在时刻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。
|
||||||||||||||||||||
|
输入描述 Input Description
|
||||||||||||||||||||
|
输入第一行包含一个整数n,即订单数目。以下n行每行三个整数ti, gi, mi。
|
||||||||||||||||||||
|
输出描述 Output Description
|
||||||||||||||||||||
|
输出仅一行,为最大总收入。输出保证在32位带符号整数范围内。
|
||||||||||||||||||||
|
样例输入 Sample Input
|
||||||||||||||||||||
|
2
5 1 8 7 15 3 |
||||||||||||||||||||
|
样例输出 Sample Output
|
||||||||||||||||||||
|
11
|
||||||||||||||||||||
|
数据范围及提示 Data Size & Hint
|
||||||||||||||||||||
|
这道题让我特别失落。有时候这就是命运,你必须接受。
首先n<=15,可以2^n枚举到底选哪个物品,然后再进行判定这堆物品到底可不可以选。
对于一段时间,肯定是先提高生产力,然后再开始干活,这样的策略一定是没有错的。
于是我先想:我们能不能先玩命加生产力,一边加一边判断,再加生产力会不会没有时间,这样既能保证能取到这个物品,而且此后我们的生产力还很大。但是继续想了想发现,如果前面浪大了一直不造物品,一直蓄力,直到最后才敢时间造完当前物品,结果发现下一个物品时间已经不够了,这种情况是很可能存在的,所以以上策略失败。
针对于我刚刚出现的问题,我想,一定要在当前这段时间内保证生产的物品尽可能多(不再追求于生产力),于是我就列了一个式子(v0+x)(t-x)其中v0表示这段时间开始的时候的生产力,x表示停止蓄力的时间,t是这段时间的长度,于是我们只需令这个式子最大即可,这是一个简单二次函数求极值问题,我们程序算完之后这段时间内的最大值,也就是说生产了一坨物品,当前这个物品耗掉一些,之后继续做,感觉这种思路每一段时间内都能得到最大的物品数,看样子是很靠谱的。想到这个做法之后,我还有一个质疑,最大的物品数,生产力并一定是最大的,可能最终的答案也会有所不同。但是我无法证明,其实是因为式子过于繁琐,比较难证。
然后我就写了一波,然后交了一发。很显然是WA的。心情不爽的我看了正解:
正解是在我最开始的思路上继续的:既然这么做我们只是考虑眼前的利益,并且会影响到我们以后的收益,那么我们为什么不在这时就把后边所有物体全考虑一遍呢?还是那个式子(v0+x)(ti-x)>=gi是一个不等式,解出来一个区间,对于每一个i都有一个区间,也就是说x在这些区间的交集中都可以满足使得后面的全取上,贪心的原则:生产力尽可能大,于是我们就去这些区间交集的最右段作为我们的生产力,继续做即可。
至于为什么是对的,我也不知道。
针对于两种贪心做法,好像每一种都有其中的道理,但是正确的做法只有一个。我抱着自己的贪心策略,懒得(不会)证明,就默认是对的了,如果你运气好,直接想到了方法2,算你命好,如果像我一样在走方案1时遇到困难转而跳转为方案2,就卒了。
针对于这类事情,我也不知道该怎么办。
看到贪心题的题解之后,觉得这种贪心策略挺显然的,考试的时候我肯定能想到,是么?考试的时候你可能猜到了另外一种策略,抱有自己的策略一定是正确的观点做题,只能靠命运了。
管大视野要了数据,等数据来了我手测一下,10个点中,我的策略究竟能跑过几个点,事后再把这道题A了的代码交上来。
明天还有物理化学考试,再见了。
我终于回来了,真是调了一年。
新代码改进:发现在计算区间时没有必要计算左端点,(可能是因为怕最后的maxl>minr),但实际上如果出现了maxl>minr,在解后期不等式一定会出现derta<0的情况,所以我们只需要计算L就可以,而不用算一个pair了。2^n的时候如果数组是从1开始记录的话if(i&(1<<(j-1))),从零的话就是if(i&(1<<(j)))
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long LL;
#define mem(a,b) memset(a,b,sizeof(a))
inline int read()
{
int x=,f=;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-;c=getchar();}
while(isdigit(c)){x=x*+c-'';c=getchar();}
return x*f;
}
const int oo=;
const double eps=1e-;
struct indent
{
int t;LL g,m;
bool operator < (const indent &s)const {return t<s.t;}
indent() {}
indent(int _1,LL _2,LL _3):t(_1),g(_2),m(_3) {}
}bill[],a[];
int n,all,now,cnt,tmp;
LL ans,nans;
LL downfloor(double x){return (LL)floor(x);}
LL f(LL v0,LL t,LL a)
{
LL derta=(v0-t)*(v0-t)-*(a-v0*t);
if(derta<)return -1ll;
double x2=((double)(t-v0)+sqrt(derta))/2.0;
return downfloor(x2);;
}
bool check(int now)
{
LL sum=,v0=,t,minr,SUM;
for(int i=;i<=cnt;i++)
{
minr=a[i].t-a[i-].t;SUM=;
for(int j=i;j<=cnt;j++)
{
SUM+=a[j].g;
t=a[j].t-a[i-].t;
if(SUM>sum)minr=min(minr,f(v0,t,SUM-sum));
if(minr<)return ;
}
if(minr<)return false;
v0+=minr;
sum+=((a[i].t-a[i-].t-minr)*v0-a[i].g);
}
return true;
}
int main()
{
n=read();
for(int i=;i<=n;i++)bill[i].t=read(),bill[i].g=read(),bill[i].m=read();
sort(bill+,bill++n);
all=<<n;a[].t=;
for(int i=;i<all;i++)
{
cnt=nans=;
for(int j=;j<=n;j++)if(i&(<<(j-)))a[++cnt]=indent(bill[j].t,bill[j].g,bill[j].m),nans+=bill[j].m;
if(check(i))ans=max(ans,nans);
}
printf("%lld\n",ans);
return ;
}
/* 5
12 30 49
20 17 3
26 7 12
71 1109 1113
86 1578 3136 3200
*/
最后说一句:垃圾贪心毁我青春。
[BZOJ2667][cqoi2012][kcoj]模拟工厂的更多相关文章
- [BZOJ2667][cqoi2012]模拟工厂
[BZOJ2667][cqoi2012]模拟工厂 试题描述 有一个称为“模拟工厂”的游戏是这样的:在时刻0,工厂的生产力等于1.在每个时刻,你可以提高生产力或者生产商品.如果选择提高生产力,在下一个时 ...
- [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 ...
- 贪心(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 ...
随机推荐
- Java实现牛顿迭代法求解平方根、立方根
一.简介 牛顿迭代法(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法. ...
- mysql性能的检查和优化方法
这个命令可以看到当前正在执行的sql语句,它会告知执行的sql.数据库名.执行的状态.来自的客户端ip.所使用的帐号.运行时间等信息 mysql在遇到严重性能问题时,一般都有这么几种可能:1.索引没有 ...
- SpringBoot整合SpringDataJPA及在页面yaml中显示
SpringBoot整合SpringDataJPA及在页面yaml中显示 1:创建对应的数据表 2:添加依赖 3:配置数据源 1:创建对应的数据表 CREATE TABLE `user` ( `id` ...
- Makefile的简洁模版
博客地址:http://www.cnblogs.com/zengjianrong/p/4184854.html 为了方便编译零碎的测试代码,在代码的存放目录编辑了一个Makefile,添加新代码文件后 ...
- 奥展项目笔记01--不同网站,点击工具--开发人员工具F12,显示的页面怎么不一样
开发人员工具F12,显示的页面不一样: 样式1: 样式2: 解决方案:兼容模式和极速模式的开发者工具不一样,改成极速模式就ok了.
- MySQL中的 redo 日志文件
MySQL中的 redo 日志文件 MySQL中有三种日志文件,redo log.bin log.undo log.redo log 是 存储引擎层(innodb)生成的日志,主要为了保证数据的可靠性 ...
- SCCM+WSUS的方式分发补丁
简单来说,System Center Configuration Manager(SCCM/ConfigMgr)由SMS(Systems Management Server)发展而来,其作为一款针对企 ...
- 【docker】centos7 上拉取docker镜像,一直拉取不到,报错:Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while w
镜像拉取一直报错: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request cancel ...
- http响应总结:常见http响应错误总结
工作中经常会被同事问这个http请求为什么调不通,我虽然能解释清楚错误是什么,但是没有总结过,想到刚开始时,也是看了别人的文章才会的,所以总结一下,贡献一下自己的经验. http 404 响应 404 ...
- Delphi - 利用TRzTrayIcon实现WinFrm工程最小化到托盘
第三方RC控件的安装 浏览器搜索Delphi Rz控件下载,找到下载一个安装文件,解压后点击RC3.exe一键安装. Delphi WinFrm工程最小化到托盘 Delphi新建WinFrm工程,在主 ...