一看到这种求\(min/max\left \{ \frac{\sum a_i}{\sum b_i} \right \}\)的题肯定是\(01\)分数规划,大概可以算作一种二分?

设\(ans\)为当前枚举到的答案,对于本题,如果想把答案往更小的方向更新,必须满足:

\[\sum a_i-ans*\sum b_i \leq 0\]

即:

\[\sum a_i-ans* b_i \leq 0\]

二分从来都是套板子的事,难点是如何写一个\(check\)函数

发现枚举第一个做的任务不现实(有后面跟着第二个任务和不跟第二个任务两种情况,不好讨论),考虑枚举第二个做的任务的最大总价值,用 \(总价值-第二个任务的价值\) 即可,

这个可以用\(Dp\)求:设\(f[i][j]\)表示枚举到在数列\(a\)中排名为\(i\)的任务,一共做了\(j\)个任务时的最大价值。转移方程为:

\[f[i][j+k]=max\left \{ f[i+1][j]+W[i][k](0\leq k \leq cnt[i]) \right \}\]

\(W[i][j]\)为把排名为\(i\)的任务中,价值\((a-ans*b)\) 最大的\(j\)个任务的价值和

注意的事:

1、向上取整

2 、用cout一定要输出long long!!

代码:

#include <bits/stdc++.h>
#define rd(x) scanf("%d",&x)
#define N 55
#define getrank(x) lower_bound(p+1,p+sz+1,x)-p
#define rnk(i) x[i].rnk
#define ll long long
using namespace std;

const double eps=1e-7;
struct qwq{
    int a,b,rnk;
    double v;
}x[N];
int n,cnt[N],pre[N],num[N],sz;
double f[N][N],p[N],W[N][N];

bool cmp(const qwq &x,const qwq &y){ return (x.a==y.a)?x.v>y.v:x.a>y.a; }

double check(double tmp){
    double tot=0,ans=0;int i,j,k;
    for(i=1;i<=n;++i){
        x[i].v=(double)x[i].a-tmp*x[i].b;
        tot+=x[i].v;
    }
    sort(x+1,x+n+1,cmp);memset(f,0xc0,sizeof(f));memset(num,0,sizeof(num));
    for(i=1;i<sz;++i) W[i][0]=0;
    for(i=1;i<=n;++i) W[rnk(i)][++num[rnk(i)]]=W[rnk(i)][num[rnk(i)]-1]+x[i].v;
    ans=f[0][0];
    if(sz==1) return tot-W[sz][num[1]];
    for(int j=0;j<=min(num[sz],num[sz-1]);++j) f[sz-1][j]=W[sz-1][j];
    for(i=sz-2;i>=1;--i){
        for(j=0;j<=pre[sz-1]-pre[i];++j)
            for(k=0;k<=num[i];++k)
                if(n-pre[i]-2*j>=k) f[i][j+k]=max(f[i+1][j]+W[i][k],f[i][j+k]);
    }
    for(i=0;i<=pre[sz-1];++i) ans=max(ans,f[1][i]);
    return tot-ans;
}

int main(){
    int i;
    rd(n);
    for(i=1;i<=n;++i) rd(x[i].a),p[i]=x[i].a;
    for(i=1;i<=n;++i) rd(x[i].b);
    sort(p+1,p+n+1);sz=unique(p+1,p+n+1)-p-1;
    for(i=1;i<=n;++i) cnt[x[i].rnk=getrank(x[i].a)]++;
    for(i=1;i<=sz;++i) pre[i]=pre[i-1]+cnt[i];
    if(sz==1){
        ll aa=0,bb=0;
        for(i=1;i<=n;++i) aa+=1ll*x[i].a,bb+=1ll*x[i].b;
        double qwq=(double)aa/bb*1000.0;
        printf("%I64d",(ll)ceil(qwq));return 0;
    }
    double l=0,r=1e8;
    while(r-l>eps){
        double mid=(r-l)*0.5+l;
        if(check(mid)<=0) r=mid;
        else l=mid;
    }
    l*=1000.0;
    printf("%I64d",(ll)ceil(l));
}

CF993D Compute Power(二分+Dp)的更多相关文章

  1. Codeforces 994F Compute Power 二分+DP

    题意:给n个任务 每个任务有两个值$a,b$ 现有许多机器 每台最多可以执行两次任务 若存在第二次任务则满足$a_{second}<a_{first}$ 定义代价$val = \frac { \ ...

  2. 二分+DP HDU 3433 A Task Process

    HDU 3433 A Task Process Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  3. hdu 3433 A Task Process 二分+dp

    A Task Process Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  4. 2018.10.24 NOIP模拟 小 C 的数组(二分+dp)

    传送门 考试自己yyyyyy的乱搞的没过大样例二分+dp二分+dp二分+dp过了606060把我自己都吓到了! 这么说来乱搞跟被卡常的正解比只少101010分? 那我考场不打其他暴力想正解血亏啊. 正 ...

  5. 「学习笔记」wqs二分/dp凸优化

    [学习笔记]wqs二分/DP凸优化 从一个经典问题谈起: 有一个长度为 \(n\) 的序列 \(a\),要求找出恰好 \(k\) 个不相交的连续子序列,使得这 \(k\) 个序列的和最大 \(1 \l ...

  6. 【bzoj1044】[HAOI2008]木棍分割 二分+dp

    题目描述 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长度最小, 并且 ...

  7. Luogu P2511 [HAOI2008]木棍分割 二分+DP

    思路:二分+DP 提交:3次 错因:二分写萎了,$cnt$记录段数但没有初始化成$1$,$m$切的次数没有$+1$ 思路: 先二分答案,不提: 然后有个很$naive$的$DP$: 设$f[i][j] ...

  8. 洛谷$P4322\ [JSOI2016]$最佳团体 二分+$dp$

    正解:二分+$dp$ 解题报告: 传送门$QwQ$ 这题长得好套路嗷,,,就一看就看出来是个$01$分数规划+树形$dp$嘛$QwQ$. 考虑现在二分的值为$mid$,若$mid\leq as$,则有 ...

  9. $bzoj3872\ [Poi2014]\ Ant\ colony$ 二分+$dp$

    正解:二分+$dp$ 解题报告: 传送门$QwQ$ 一年过去了依然没有头绪,,,$gql$的$NOIp$必将惨败了$kk$. 考虑倒推,因为知道知道除数和答案,所以可以推出被除数的范围,然后一路推到叶 ...

随机推荐

  1. iOS-----------设置自定义字体

    1.将字体加入到项目中 2.在info.plist文件中加入相应信息,这一步实际上实在项目的Info页里面增加Fonts provided by application项,并设置相应的ttf文件进去, ...

  2. Android Studio获取开发版SHA1值和发布版SHA1值的史上最详细方法

    前言: 今天我想把百度地图的定位集成到项目中来,想写个小小的案例,实现一下,但在集成百度地图时首先要申请秘钥,申请秘钥要用到SHA1值,所以今天就来总结一下怎样去获取这个值吧,希望对大家有帮助. 正常 ...

  3. Android studio设置文件头,定制代码注释

    一.说明 在下载或者看别人的代码我们常会看见,每一个文件的上方有个所属者的备注.如果要是一个一个备注那就累死了. 二.设置方法 File >>> Setting >>&g ...

  4. 测者的性能测试手册:Web压力测试工具webbench

    webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好,安装使用也特别方便. 1.适用系统:Linux 2.编译安装: wget http:/ ...

  5. 【初学必备】Win10环境下Anaconda安装

    Anaconda集合了python,Spyder,Jupyter notebook及conda-----包管理器与环境管理器(含常用的panda,numpy等),省去单独下载的繁琐步骤,方便使用. 注 ...

  6. git、github、gitlab之间的关系

    GIt-版本控制工具:GitHub-一个网站平台,提供给用户空间存储git仓储,保存用户的一些数据文档或者代码等:GitLab - 基于Git的项目管理软件. Git分布式版本控制系统 Git是一款自 ...

  7. Hadoop Yarn配置项 yarn.nodemanager.resource.local-dirs探讨

    1. What is the recommended value for "yarn.nodemanager.resource.local-dirs"? We only have ...

  8. 重建二叉树[by Python]

    题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2 ...

  9. P1354 房间最短路问题

    传送门 可以发现,最短路一定要经过墙壁的断点. 那么把房间看作一个有向图,墙壁的断点为节点,求从起点到终点的最短路. 这道题的难点在于建图.枚举所有的断点,若可以走则加入这条边. 判断两点是否连通,即 ...

  10. Asp.Net WebApi 使用OWIN架构后,出现 “没有 OWIN 身份验证管理器与此请求相关联(No OWIN authentication manager is associated with the request)” 异常的解决办法

    在Asp.Net WebApi 项目中使用OWIN模块之后,如果没有在OWIN的Startup类中配置认证方式,调用WebApi的相关Controller和Action就会出现如下异常: 出现错误. ...