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

标签:题解

阅读体验:https://zybuluo.com/Junlier/note/1327574

链接题目地址:洛谷P3161 BZOJ P2667

这个题练一练综合思想还是不错的。。。(然而蒟蒻不会啊)

做法

肯定是在能完成某些订单的情况下使自己生产力越高越好是吧(一个大致的贪心方向)

但是我们不知道自己到底应该怎么去决定提高生产力时间

那么换个角度,不从时间来看,从订单上来看

贪心

我们假设一定要完成订单\(1~n\)

那么应该如何贪心选时间提升生产力呢,当然是在能满足所有订单的基础上尽量多地提高生产力

那么对于订单\(i\)和\(j\),我们都会得到方程:(设\(pdc(produce)\)为完成订单\(i\)时的生产力,\(T\)为距离\(j\)订单的时间,\(x\)为用来提升生产力的时间,\(gv(give)\)是订单\(j\)需求量)

\[(pdc+x)×(T-x)=gv$$对所有我们一定要完成的订单一个一个完成,每次完成一个订单时对它之后的每一个订单我们都解这么一个方程,得到尽可能的休息时间,那么这样子一定是对的吧

### 然后可以想到
上面是$1~n$我们都想完成,现在不同了,我们可以放弃一些订单
再看数据范围:$n<=15$?,那不就暴力枚举状态选还是不选啊
然后对于上面那个方程,如果无解$△ < 0$肯定这种计划是不行的
然后直接用求根公式会得到:$$\frac{T-pdc+\sqrt{(pdc+T)^2-4×gv}}{2}$$算一下时间复杂度:$O(2^n×n^2)$很对呀,那就做完了
~~枚举状态虽可以直接枚举,但也可以搜是吧,那我们就叫他搜索了~~

### 给出代码
哼哼~压行是看代码人的噩梦,是写代码者的美梦(~~虽然笔者只稍稍压行了。。。~~)
```
#include<bits/stdc++.h>
#define il inline
#define rg register
#define ldb double
#define lst long long
#define rgt register int
#define N 20
#define M 100050
using namespace std;
const int Inf=1e9;
il lst MAX(rg lst x,rg lst y){return x>y?x:y;}
il lst MIN(rg lst x,rg lst y){return x<y?x:y;}
il int read()
{
int s=0,m=0;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')m=1;ch=getchar();}
while( isdigit(ch))s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return m?-s:s;
}

int n,UP;
lst Ans,Res;
int sgn[N],top;
struct DD{lst tt,gv,gt;}ljl[N];
bool cmp(const int&a,const int&b){return ljl[a].tt<ljl[b].tt;}

il void Solve(rgt Zt)
{
top=Res=0;
for(rgt i=1;i<=n;++i)
if(Zt&(1<<(i-1)))sgn[++top]=i,Res+=ljl[i].gt;
if(Res<Ans)return;
sort(&sgn[1],&sgn[top+1],cmp);
rg lst pdc=1,rest=0;
rg bool flag=true;
for(rgt i=0;i<top;++i)
{
rg lst nd=0,brk=Inf;
for(rgt j=i+1;j<=top;++j)
{
nd+=ljl[sgn[j]].gv;
rg lst tm=ljl[sgn[j]].tt-ljl[sgn[i]].tt;
rg lst b=pdc-tm,c=nd-rest-pdc*tm;
if(b*b-4*c<0){flag=false;break;}//delta
rg lst x=(sqrt(b*b-4*c)-b)/2;
brk=MIN(brk,x);
}pdc+=brk;
rest+=pdc*(ljl[sgn[i+1]].tt-ljl[sgn[i]].tt-brk)-ljl[sgn[i+1]].gv;
if(!flag||brk<0||rest<0){flag=false;break;}
}if(flag)Ans=MAX(Ans,Res);
}

int main()
{
n=read(),UP=(1<<n);
for(rgt i=1;i<=n;++i)
ljl[i]=(DD){read(),read(),read()};
for(rgt i=1;i<UP;++i)Solve(i);
return printf("%lld\n",Ans),0;
}
```\]

[CQOI2012]模拟工厂 题解(搜索+贪心)的更多相关文章

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

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

  2. [BZOJ2667][cqoi2012]模拟工厂

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

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

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

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

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

  5. P3161 [CQOI2012]模拟工厂

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

  6. luoguP1084 疫情控制(题解)(搜索+贪心)

    luoguP1084 疫情控制 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include& ...

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

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

  8. 【BZOJ2426】[HAOI2010]工厂选址(贪心)

    [BZOJ2426][HAOI2010]工厂选址(贪心) 题面 BZOJ 洛谷 题解 首先看懂题目到底在做什么. 然而发现我们显然可以对于每个备选位置跑一遍费用流,然后并不够优秀. 不难发现所有的位置 ...

  9. hdu4740【杭州网赛、模拟、有点搜索?】

    当时看了这题就感觉so easy...  本来不想写的,后来感觉是不是可以练一下搜索水平.. 比赛时有人过了就没写.       比赛完了写一下. 实现还不是那么顺利,  囧 本来自己以为这题能练下搜 ...

随机推荐

  1. 上采样 及 Sub-pixel Convolution (子像素卷积)

    参考:https://blog.csdn.net/leviopku/article/details/84975282 参考:https://blog.csdn.net/g11d111/article/ ...

  2. registry搭建及镜像管理

    registry 的搭建 docker pull registry:2 docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 -- ...

  3. 字符串:StringBuilder()

    String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) [1]String和StringBuffer      String ...

  4. 洛谷P2482 [SDOI2010]猪国杀——题解

    猪国杀,模拟题的一颗耀眼的明珠,成长大牛.锻炼码力必写题! 模拟题没什么思维难度.只要按部就班地去做就是.模拟简单在这,难也在这.因为题面巨长,条件巨多,忽疏一点都有可能全盘皆输.故推荐考试时碰见了, ...

  5. sqli-lab(37)

    0X01 看看源码 what is mean? 定义和用法 mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符. 下列字符受影响: \x00 \n ...

  6. [CSP-S模拟测试]:格式化(贪心)

    题目传送门(内部题105) 输入格式 每组数据第一行一个正整数$n$,表示硬盘块数,接下来$n$行,每行两个正整数,第一个正整数为硬盘格式化前的容量,第二个正整数为格式化之后的容量. 输出格式 对每组 ...

  7. 运行Spark官方提供的例子

    去spark官网把spark下载下来: https://spark.apache.org/downloads.html 解压,可以看下目录: 其中examples目录下提供了java,scala,py ...

  8. python正则之match search findall

    match:只匹配一次,开头匹配不上,则不继续匹配 a,b,\w+ match(a,"abcdef") 匹配a >>> re.match("a" ...

  9. 《Effective Java》读书笔记 - 3.对于所有对象都通用的方法

    Chapter 3 Methods Common to All Objects Item 8: Obey the general contract when overriding equals 以下几 ...

  10. 关于vue给对象新增属性页面不会动态更新

    不知道大家有没有遇到过这个问题,当我们给data里边声明或者已经赋值过的对象或者数组,添加新的属性时,如果更新此属性的值是不会动态更新视图的. $set 看以下实例: 我们开始给drug_list追加 ...