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

传送门

解题思路

贪心,首先因为\(n\)比较小,可以\(2^n\)枚举子集。然后判断的时候就每次看后面的如果用最大生产力生产能不能达成目标,解一个二次函数。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define int long long

using namespace std;
const int MAXN = 25;
typedef long long LL;

inline int rd(){
    int x=0,f=1;char ch=getchar();
    while(!isdigit(ch)) {f=ch==‘-‘?0:1;ch=getchar();}
    while(isdigit(ch))  {x=(x<<1)+(x<<3)+ch-‘0‘;ch=getchar();}
    return f?x:-x;
}

int n,t[MAXN],g[MAXN],m[MAXN],cnt,mk[MAXN],ans;
int tmp[MAXN];

inline bool cmp(int x,int y){
    return t[x]<t[y];
}

int calc(int a,int b,int c){
    double delta=b*b-4*a*c;
    if(delta<0) return -1;
    return floor((-b+sqrt(delta))/(a*2));
}

inline bool check(){
    for(int i=1;i<=cnt;i++) tmp[i]=mk[i];
    sort(tmp+1,tmp+1+cnt,cmp);
    int tt,now=1;LL sum=0,res=0;
    for(int i=1;i<=cnt;i++){
        sum=0;tt=t[tmp[i]]-t[tmp[i-1]];
        for(int j=i;j<=cnt;j++){
            sum+=g[tmp[j]];
            if(sum>res)
                tt=min(tt,calc(1,now-t[tmp[j]]+t[tmp[i-1]],
                sum-res-now*(t[tmp[j]]-t[tmp[i-1]])));
        }
        if(tt<0) return false;
        now+=tt;res+=(now*(t[tmp[i]]-t[tmp[i-1]]-tt)-g[tmp[i]]);
    }
    return true;
}

void dfs(int x,LL sum){
    if(x==n+1) {if(sum>ans) if(check()) ans=sum;return;}
    mk[++cnt]=x;dfs(x+1,sum+m[x]);
    cnt--;dfs(x+1,sum);
}

signed main(){
//  freopen("data.txt","r",stdin);
//  freopen("B.txt","w",stdout);
    n=rd();
    for(int i=1;i<=n;i++) t[i]=rd(),g[i]=rd(),m[i]=rd();
    dfs(1,0);cout<<ans;
    return 0;
}

原文地址:https://www.cnblogs.com/sdfzsyq/p/9812761.html

时间: 2024-11-06 10:00:52

LUOGU P3161 [CQOI2012]模拟工厂 (贪心)的相关文章

BZOJ 2667 cqoi2012 模拟工厂 贪心

题目大意:现在你有一个工厂,初始生产力为1,每一时刻你可以进行如下操作: 1.将生产力提高1 2.生产一些产品,数量等于当前生产力的数值 现在你有n个订单,每一份有一个交易时间t,一个商品数量g和一个价格m,可以接或者不接,如果接就要在t时刻操作之前减少g的商品数量,然后得到m的钱 求最大收益 跪shanest大爷... 由于n≤15,爆枚接受哪些订单 每次Check的时候,对于每段时间显然先提高生产力再生产产品 那么我可以考虑这一段内先尽量提高生产力 但是这样可能会导致生产力提高得太高而没有足

[BZOJ2667][cqoi2012]模拟工厂

试题描述 有一个称为"模拟工厂"的游戏是这样的:在时刻0,工厂的生产力等于1.在每个时刻,你可以提高生产力或者生产商品.如果选择提高生产力,在下一个时刻时工厂的生产力加1:如果选择生产商品,则下一个时刻你所拥有的商品数量增加p,其中p是本时刻工厂的生产力. 有n个订单,可以选择接受或者不接受.第i个订单(ti, gi, mi)要求在时刻ti给买家提供gi个商品,事成之后商品数量减少gi,而收入增加mi元.如果接受订单i,则必须恰好在时刻ti交易,不能早也不能晚.同一时刻可以接受多个订单

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

题目描述 Description 有一个称为"模拟工厂"的游戏是这样的:在时刻0,工厂的生产力等于1.在每个时刻,你可以提高生产力或者生产商品.如果选择提高生产力,在下一个时刻时工厂的生产力加1:如果选择生产商品,则下一个时刻你所拥有的商品数量增加p,其中p是本时刻工厂的生产力. 有n个订单,可以选择接受或者不接受.第i个订单(ti, gi, mi)要求在时刻ti给买家提供gi个商品,事成之后商品数量减少gi,而收入增加mi元.如果接受订单i,则必须恰好在时刻ti交易,不能早也不能晚.

POJ 1696 Space Ant --枚举,模拟,贪心,几何

题意: 有很多点,从最右下角的点开始走起,初始方向水平向右,然后以后每步只能向左边走,问最多能走多少个点. 解法: 贪心的搞的话,肯定每次选左边的与它夹角最小的点,然后走过去. 然后就是相当于模拟地去选点,然后计数,然后走过去.这题就这么搞定了. 我这里用了set和vector. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include &

CodeForces 342B Xenia and Spies (水题模拟,贪心)

题意:给定 n 个间谍,m个区间,一个 s,一个f,然后从 s开始传纸条,然后传到 f,然后在每个 t 时间在区间内的不能传,问你最少的时间传过去. 析:这个题,就模拟一下就好,贪心策略,能传就传,找好方向,一直传就行,传到 f 就结束. 代码如下: #include <bits/stdc++.h> using namespace std; struct node{ int l, r, t; bool operator < (const node &p) const{ retur

模拟,贪心,枚举(二)

#####例题二:高精度练习(没错,高精度也是模拟呀) 此处我就不给题目描述了,反正就是unsigned long long也存不下的数字搞运算,除法和取模比较困难,这里只讲加减乘. 题目评测的话可以参照codevs高精度练习系列. [分析] 高精度的核心实际上就是模拟人列竖式手算的过程.但是细节的处理才是写好高精度的关键. 首先就是数字的存储:既然没办法存在变量里面,我们可以用一个字符串来存储,毕竟我们看到一个超长的数字也是一位一位的读下来对吧.那么直接string,然后cin好了~ 然后是运

【Luogu】P3574FAR_FarmCraft(树形贪心)

题解链接 想了一个错的贪心爆零了,气死. 题目链接 #include<cstdio> #include<cctype> #include<cstring> #include<algorithm> #include<cstring> #define maxn 500050 using namespace std; inline long long read(){ long long num=0,f=1; char ch=getchar(); whi

zoj4062 Plants vs. Zombies 二分+模拟(贪心的思维)

题目传送门 题目大意:有n个植物排成一排,标号为1-n,每株植物有自己的生长速度ai,每对植物浇一次水,该株植物就长高ai,现在机器人从第0个格子出发,每次走一步,不能停留,每一步浇一次水,总共可以走m步,问最矮的植物最高是多少. 思路: 一般此类最小值最大问题都是二分,此题显然也是可以二分植物的高度的. 确定某一个高度后,也确定了每个植物需要浇几次水,而对于一株植物来说,应当尽可能的在这株植物和后面那个格子来回走,是这株植物迅速超过最低高度(这样的走法是最优的,因为可以想象,如果往后走很多步再

Luogu P2827 蚯蚓(模拟)

P2827 蚯蚓 题意 题目描述 本题中,我们将用符号\(\lfloor c\rfloor\)表示对\(c\)向下取整,例如:\(\lfloor 3.0\rfloor =\lfloor 3.1\rfloor =\lfloor 3.9\rfloor =3\). 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓. 蛐蛐国里现在共有\(n\)只蚯蚓(\(n\)为正整数).每只蚯蚓拥有长度,我们设第\(i\)只蚯蚓的长度为\(a_i(i=1,2,\dots