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.对连续段重新进行等概率 ...
随机推荐
- 微信小程序-点击图片预览
拿接口 有封装 封装查看另外的博文 点击动作 WXHTML 注意 data-xxxx自定义属性 这样知道我点的是哪个参数
- Java与groovy混编 —— 一种兼顾接口清晰和实现敏捷的开发方式
有大量平均水平左右的"工人"可被选择.参与进来 -- 这意味着好招人 有成熟的.大量的程序库可供选择 -- 这意味着大多数项目都是既有程序库的拼装,标准化程度高而定制化场景少 开发 ...
- iOS8 UICollectionView横向滑动demo
在iOS8中,scrollView和加载在它上面的点击事件会有冲突,所以做一个横向滑动的界面最好的选择就是UICollectionView. 这个效果可以用苹果公司提供的官方demo修改而来,下载地址 ...
- Apache的对象复制详解
BeanUtils.copyProperties 和 PropertyUtils.copyProperties 两个工具类都是对两个bean之前存在name相同的属性进行处理,无论是源bean或者目标 ...
- MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
Java面试通关手册(Java学习指南,欢迎Star,会一直完善下去,欢迎建议和指导):https://github.com/Snailclimb/Java_Guide 一 MyISAM 1.1 My ...
- casperjs 知乎登陆
phantom.casperTest = true; phantom.outputEncoding="utf-8"; var fs = require('fs'); var cas ...
- c# 获取百度最后的url
using System;using System.Collections.Generic;using System.Linq;using System.Net.Http;using System.T ...
- java虚拟机规范(se8)——java虚拟机结构(三)
2.6. 栈帧 栈帧用于存储数据和部分结果,同样也用于执行动态链接,返回方法的值和分派异常. 当方法被调用的时候会创建一个新的栈帧.当一个方法调用结束时,它对应的栈帧就被销毁了,不管是正常调用结束还是 ...
- python2.x下pip install mysql-python报错解决办法
在https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysql-python 下载该驱动网盘链接:https://pan.baidu.com/s/1r0fNYnU ...
- java 重新抛出异常
一.有时希望把刚捕获的异常重新抛出,尤其时在使用Exception捕获所以异常的时候,既然已经得到了对当前异常对象的引用,可以重新把它抛出: catch(Exception e){ System.ou ...