CF993D Compute Power(二分+Dp)
一看到这种求\(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)的更多相关文章
- Codeforces 994F Compute Power 二分+DP
题意:给n个任务 每个任务有两个值$a,b$ 现有许多机器 每台最多可以执行两次任务 若存在第二次任务则满足$a_{second}<a_{first}$ 定义代价$val = \frac { \ ...
- 二分+DP HDU 3433 A Task Process
HDU 3433 A Task Process Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- hdu 3433 A Task Process 二分+dp
A Task Process Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- 2018.10.24 NOIP模拟 小 C 的数组(二分+dp)
传送门 考试自己yyyyyy的乱搞的没过大样例二分+dp二分+dp二分+dp过了606060把我自己都吓到了! 这么说来乱搞跟被卡常的正解比只少101010分? 那我考场不打其他暴力想正解血亏啊. 正 ...
- 「学习笔记」wqs二分/dp凸优化
[学习笔记]wqs二分/DP凸优化 从一个经典问题谈起: 有一个长度为 \(n\) 的序列 \(a\),要求找出恰好 \(k\) 个不相交的连续子序列,使得这 \(k\) 个序列的和最大 \(1 \l ...
- 【bzoj1044】[HAOI2008]木棍分割 二分+dp
题目描述 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长度最小, 并且 ...
- Luogu P2511 [HAOI2008]木棍分割 二分+DP
思路:二分+DP 提交:3次 错因:二分写萎了,$cnt$记录段数但没有初始化成$1$,$m$切的次数没有$+1$ 思路: 先二分答案,不提: 然后有个很$naive$的$DP$: 设$f[i][j] ...
- 洛谷$P4322\ [JSOI2016]$最佳团体 二分+$dp$
正解:二分+$dp$ 解题报告: 传送门$QwQ$ 这题长得好套路嗷,,,就一看就看出来是个$01$分数规划+树形$dp$嘛$QwQ$. 考虑现在二分的值为$mid$,若$mid\leq as$,则有 ...
- $bzoj3872\ [Poi2014]\ Ant\ colony$ 二分+$dp$
正解:二分+$dp$ 解题报告: 传送门$QwQ$ 一年过去了依然没有头绪,,,$gql$的$NOIp$必将惨败了$kk$. 考虑倒推,因为知道知道除数和答案,所以可以推出被除数的范围,然后一路推到叶 ...
随机推荐
- clCreateBuffer和clCreateBuufer + clEnqueueWriteBuffer
有两种方式实现从主机到CL设备的数据传递, 第一种: cl_mem input = clCreateBuffer(context,CL_MEM_READ_ONLY,sizeof(float) * DA ...
- Maven的基础了解与使用
目录 Maven的介绍: 什么是Maven: 为什么要学习maven? 安装与配置: 下载: 配置环境变量 测试安装结果: Maven概念: 坐标 仓库 入门示例 创建maven工程: 添加依赖 Ma ...
- FIDDLER的使用方法及技巧总结
转自: https://www.cnblogs.com/ink-marks/p/6363275.html 一.FIDDLER快速入门及使用场景 Fiddler的官方网站:http://www.fidd ...
- Linux 中磁盘阵列RAID10配置
首先,了解一下RAID是什么?(百度所得) 独立磁盘冗余阵列(RAID,redundant array of independent disks)是把相同的数据存储在多个硬盘的不同的地方(因此,冗余地 ...
- CGI 、FastCGI、PHP-CGI、PHP-FPM 定义以及与nginx的应用关系
CGI common gateway interface,简称cgi,简而言之就是一个接口,一种协议.它的作用就是帮助服务器与语言通信. 这里以nginx和php为例,因为nginx和php的语言不通 ...
- 【iOS开发】Alamofire框架的使用二 高级用法
Alamofire是在URLSession和URL加载系统的基础上写的.所以,为了更好地学习这个框架,建议先熟悉下列几个底层网络协议栈: URL Loading System Programming ...
- Web应用安全测试
偷偷挪用人家的分享: https://blog.csdn.net/aojie80/article/details/43836521 写的很棒 Burp Suite 介绍 https://blog.cs ...
- 英语口语练习系列-C09-常用动词
<先秦 · 关雎> 关关雎鸠,在河之洲.窈窕淑女,君子好逑. 参差荇菜,左右流之.窈窕淑女,寤寐求之. 求之不得,寤寐思服.悠哉悠哉,辗转反侧. 参差荇菜,左右采之.窈窕淑女,琴瑟友之. ...
- 英语口语练习系列-C07-谈女孩
<将进酒>·李白 君不见黄河之水天上来,奔流到海不复回. 君不见高堂明镜悲白发,朝如青丝暮成雪. 人生得意须尽欢,莫使金樽空对月. 天生我材必有用,千金散尽还复来. 烹羊宰牛且为乐,会须一 ...
- Django REST framework 中文文档
Django REST framework介绍 现在前后端分离的架构设计越来越流行,业界甚至出现了API优先的趋势. 显然API开发已经成为后端程序员的必备技能了,那作为Python程序员特别是把Dj ...