Codeforces 749E Gosha is hunting 二分+DP
很神奇的一题 看完题解不由惊叹
题意:\(n\)个神奇宝贝 \(a\)个普通球 \(b\)个高级球 普通球抓住\(i\)神奇宝贝的概率为\(u[i]\) 高级球为\(p[i]\) 一起用为\(u[i]+p[i]-u[i]*p[i]\) 求期望抓到个神奇宝贝个数
\(N,a,b\leq2000\)
首先不难想到\(O(n^3)\)的暴力\(DP\) 听说CF的机子可过 我们接下来写如何优化
对于一个凸函数\(f(x)\) 我们假设可以通过某种特殊方式获得其的极值和极值点
令\(F(x)=f(x)-kx\) 不难发现\(F(x)\)也是一个凸函数 仍然假设可以获得其极值和极值点 那么求导可以看出 当\(k\)减小时 极值点会右移
对于本题 暴力的\(dp\) 为\(f[i][j][k]\) 表示到第\(i\)个神奇宝贝用了\(j\)个普通球 \(k\)个高级球的最大期望
我们可以发现如果将\(f[i][j](x)\)看做之前提到的\(f(x)\) 那么我们可以通过二分\(k\)值并不断更新 使得\(F(x)\) 的极值点为\(b\) 此时的\(ans=F[n][a]_{max}+b*k\) 即为最大值
对于一次求\(F(x)=f[n][a]-kx\)的时间复杂度为\(O(n^2)\)
#include<bits/stdc++.h>
using namespace std;
#define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
#define pa pair<int,int>
#define mod 1000000007
#define ll long long
#define mk make_pair
#define pb push_back
#define fi first
#define se second
#define cl(x) memset(x,0,sizeof x)
#ifdef Devil_Gary
#define bug(x) cout<<(#x)<<" "<<(x)<<endl
#define debug(...) fprintf(stderr, __VA_ARGS__)
#else
#define bug(x)
#define debug(...)
#endif
#define eps 1e-10
const int INF = 0x3fff;
const int N=2e3+5;
/*
char *TT,*mo,but[(1<<15)+2];
#define getchar() ((TT==mo&&(mo=(TT=but)+fread(but,1,1<<15,stdin),TT==mo))?-1:*TT++)//*/
inline int read(){
int x=0,rev=0,ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')rev=1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return rev?-x:x;
}
double f[N][N],u[N],p[N];
int n,a,b,g[N][N];
void update(double&a,int&b,double c,int d){
if(a+eps<c) a=c,b=d;
}
int calc(double k){
for(int i=1;i<=n;i++)
for(int j=0;j<=a;j++){
f[i][j]=g[i][j]=0;
update(f[i][j],g[i][j],f[i-1][j],g[i-1][j]);
update(f[i][j],g[i][j],f[i-1][j]+u[i]-k,g[i-1][j]+1);
if(!j)continue;
update(f[i][j],g[i][j],f[i-1][j-1]+p[i],g[i-1][j-1]);
update(f[i][j],g[i][j],f[i-1][j-1]+1-(1-p[i])*(1-u[i])-k,g[i-1][j-1]+1);
}
return g[n][a];
}
int main(){
#ifdef Devil_Gary
freopen("in.txt","r",stdin);
#endif
cin>>n>>a>>b;
for(int i=1;i<=n;i++) cin>>p[i];
for(int i=1;i<=n;i++) cin>>u[i];
double l=-INF,r=INF;
for(int T=1;T<=100;T++){
double mid=(l+r)/2;
if(calc(mid)<=b) r=mid;
else l=mid;
}
return printf("%.8f\n",f[n][a]+b*l),0;
}
Codeforces 749E Gosha is hunting 二分+DP的更多相关文章
- Codeforces.739E.Gosha is hunting(DP 带权二分)
题目链接 \(Description\) 有\(n\)只精灵,两种精灵球(高级和低级),每种球能捕捉到第\(i\)只精灵的概率已知.求用\(A\)个低级球和\(B\)个高级球能捕捉到精灵数的最大期望. ...
- codeforces 487B B. Strip(RMQ+二分+dp)
题目链接: B. Strip time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- codeforces 739E - Gosha is hunting
这道题有三种做法,感受一下: 感觉到了歪果仁费尽脑汁想出来的神仙贪心脑洞题被中国人套路算法踩爆的凄凉...(我的名字是不是暴露了我的真实实力) ============================ ...
- 2019.03.12 codeforces739E. Gosha is hunting(dp凸优化)
传送门 题意:nnn个物品,有aaa个XXX道具和bbb个YYY道具,XXX道具移走第iii个物品概率为pip_ipi,YYY道具移走第iii个道具概率为uiu_iui. 对于每个物品每种道具最多 ...
- [Codeforces 865C]Gotta Go Fast(期望dp+二分答案)
[Codeforces 865C]Gotta Go Fast(期望dp+二分答案) 题面 一个游戏一共有n个关卡,对于第i关,用a[i]时间通过的概率为p[i],用b[i]通过的时间为1-p[i],每 ...
- Codeforces 865C Gotta Go Fast 二分 + 期望dp (看题解)
第一次看到这种骚东西, 期望还能二分的啊??? 因为存在重置的操作, 所以我们再dp的过程中有环存在. 为了消除环的影响, 我们二分dp[ 0 ][ 0 ]的值, 与通过dp得出的dp[ 0 ][ 0 ...
- 【CF739E】Gosha is hunting(动态规划,凸优化)
[CF739E]Gosha is hunting(动态规划,凸优化) 题面 洛谷 CF 题解 一个\(O(n^3)\)的\(dp\)很容易写出来. 我们设\(f[i][a][b]\)表示前\(i\)个 ...
- 「学习笔记」wqs二分/dp凸优化
[学习笔记]wqs二分/DP凸优化 从一个经典问题谈起: 有一个长度为 \(n\) 的序列 \(a\),要求找出恰好 \(k\) 个不相交的连续子序列,使得这 \(k\) 个序列的和最大 \(1 \l ...
- 【codeforces 749E】 Inversions After Shuffle
http://codeforces.com/problemset/problem/749/E (题目链接) 题意 给出一个1~n的排列,从中等概率的选取一个连续段,设其长度为l.对连续段重新进行等概率 ...
随机推荐
- [转载]AngularJS 指令 用法
http://book.2cto.com/201312/37782.html http://www.itnose.net/detail/6144038.html http://www.cnblogs. ...
- 让你的HTML5&CSS3网站在老IE中也能正常显示的3种方法
起初,IE其实也是一款非常有进取心的浏览器.但经过一段时间的蛰伏后,它已经成为了我们生活中的一道障碍.微软现在又重新开始向其它浏览器发起挑战,但事实情况是,新版的现代IE浏览器一直滞后于谷歌浏览器和火 ...
- # 20155337 2016-2017-2 《Java程序设计》第六周学习总结
20155337 2016-2017-2 <Java程序设计>第六周学习总结 教材学习内容总结 •串流(Stream): 数据有来源及目的地,衔接两者的是串流对象.如果要将数据从来源取出, ...
- expect 交互 之双引号较长变量
交互双引号较长变量 #!/bin/bash RemoteUser=xuesong12 Ip=192.168.1.2 RemotePasswd=xuesong Cmd="/bin/echo ...
- 数链剖分(Tree)
题目链接:https://cn.vjudge.net/contest/279350#problem/D 题目大意:操作,单点查询,区间取反,询问区间最大值. AC代码: #include<ios ...
- spfa求图的最大流
题目链接: https://vjudge.net/contest/255738#problem/B AC代码: #include <iostream> #include<vector ...
- PowerDesigner显示Common注释列并自动赋值
PowerDesigner中默认不显示Common注释列,可根据以下步骤显示并紫东填充Name列内容. 1.显示Common注释列 2.运行VB Script脚本自动赋值 使用Shift+Ctrl+X ...
- linux 如何删除文件夹下面的文件和文件夹,只保留两个文件
# 删除目录下那两个文件之外的所有文件 find dir/ -type f ! -name file1 -a ! -name file2 | xargs rm -f # 删除所有空目录(非空目录不 ...
- 在Docker中运行EOS(MAC版)
在Docker中运行EOS(MAC版) 在Docker中也可以简单快速的构建EOS.IO.笔者在Mac平台下参考官方文档躺了一次河.记录如下: 安装依赖 Docker 版本 17.05或者更高 tes ...
- windows下安装apache zookeeper
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...