很神奇的一题 看完题解不由惊叹

题意:\(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的更多相关文章

  1. Codeforces.739E.Gosha is hunting(DP 带权二分)

    题目链接 \(Description\) 有\(n\)只精灵,两种精灵球(高级和低级),每种球能捕捉到第\(i\)只精灵的概率已知.求用\(A\)个低级球和\(B\)个高级球能捕捉到精灵数的最大期望. ...

  2. codeforces 487B B. Strip(RMQ+二分+dp)

    题目链接: B. Strip time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  3. codeforces 739E - Gosha is hunting

    这道题有三种做法,感受一下: 感觉到了歪果仁费尽脑汁想出来的神仙贪心脑洞题被中国人套路算法踩爆的凄凉...(我的名字是不是暴露了我的真实实力) ============================ ...

  4. 2019.03.12 codeforces739E. Gosha is hunting(dp凸优化)

    传送门 题意:nnn个物品,有aaa个XXX道具和bbb个YYY道具,XXX道具移走第iii个物品概率为pip_ipi​,YYY道具移走第iii个道具概率为uiu_iui​. 对于每个物品每种道具最多 ...

  5. [Codeforces 865C]Gotta Go Fast(期望dp+二分答案)

    [Codeforces 865C]Gotta Go Fast(期望dp+二分答案) 题面 一个游戏一共有n个关卡,对于第i关,用a[i]时间通过的概率为p[i],用b[i]通过的时间为1-p[i],每 ...

  6. Codeforces 865C Gotta Go Fast 二分 + 期望dp (看题解)

    第一次看到这种骚东西, 期望还能二分的啊??? 因为存在重置的操作, 所以我们再dp的过程中有环存在. 为了消除环的影响, 我们二分dp[ 0 ][ 0 ]的值, 与通过dp得出的dp[ 0 ][ 0 ...

  7. 【CF739E】Gosha is hunting(动态规划,凸优化)

    [CF739E]Gosha is hunting(动态规划,凸优化) 题面 洛谷 CF 题解 一个\(O(n^3)\)的\(dp\)很容易写出来. 我们设\(f[i][a][b]\)表示前\(i\)个 ...

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

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

  9. 【codeforces 749E】 Inversions After Shuffle

    http://codeforces.com/problemset/problem/749/E (题目链接) 题意 给出一个1~n的排列,从中等概率的选取一个连续段,设其长度为l.对连续段重新进行等概率 ...

随机推荐

  1. IsNullOrWhiteSpace与IsNullOrEmpty

    public static boolean IsNullOrEmpty(String value) { return (value == null || value.length() == 0);} ...

  2. AngularJS入门基础——表单验证

    <form name="form" novalidata>   <label name="email">your email</l ...

  3. 经典设计模式-iOS的实现

    最近看了<HeadFirst 设计模式>这本书,给组内伙伴准备一次分享,把这次分享记录下来,有需要的可以看看. 这本书主要介绍了四人帮23种经典设计模式中的的14种,也是常用的几种.看完这 ...

  4. 对git简单的认识

    了解git工作区.暂存区.版本库: 其中,使用 git add .就是将文件添加到了暂存区:而git commit -m ‘desc’:将暂存区的文件添加到版本库: 每次更新项目的步骤: 1)每次更新 ...

  5. centos7,php7 安装mysqli扩展

    首先安装MySQL https://www.cnblogs.com/manzb/p/9560403.html   php7安装后没有安装mysqli扩展的话: 安装mysqli扩展 1.到php文件e ...

  6. artDialog学习之旅(二)之扩展方法详解

    名称 描述 核心方法 art.dialog.top 获取artDialog可用最高层window对象.这与直接使用window.top不同,它能排除artDialog对象不存在已经或者顶层页面为框架集 ...

  7. android MeasureSpec的三个测量模式

    1.MeasureSpec含义 其实可以去看MeasureSpec的文档,里面对MeasureSpec的作用介绍得很清楚.MeasureSpec封装了父布局传递给子布局的布局要求,每个MeasureS ...

  8. MDP安装之数据库

    /usr/bin/mysqladmin -u root password 'Bic2017' mysql-community-client-5.6.28-2.el6.x86_64 mysql-comm ...

  9. C# XML 文档注释

    原文链接:http://www.shinater.com/DocsBuilder/help.html <summary>description</summary> 描述类型或类 ...

  10. YOLOv2训练自己的数据集(VOC格式)

    下周试试,参考:http://blog.csdn.net/ch_liu23/article/details/53558549 http://blog.csdn.net/sinat_30071459/a ...