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

题意:\(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)\)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
  4. #define pa pair<int,int>
  5. #define mod 1000000007
  6. #define ll long long
  7. #define mk make_pair
  8. #define pb push_back
  9. #define fi first
  10. #define se second
  11. #define cl(x) memset(x,0,sizeof x)
  12. #ifdef Devil_Gary
  13. #define bug(x) cout<<(#x)<<" "<<(x)<<endl
  14. #define debug(...) fprintf(stderr, __VA_ARGS__)
  15. #else
  16. #define bug(x)
  17. #define debug(...)
  18. #endif
  19. #define eps 1e-10
  20. const int INF = 0x3fff;
  21. const int N=2e3+5;
  22. /*
  23. char *TT,*mo,but[(1<<15)+2];
  24. #define getchar() ((TT==mo&&(mo=(TT=but)+fread(but,1,1<<15,stdin),TT==mo))?-1:*TT++)//*/
  25. inline int read(){
  26. int x=0,rev=0,ch=getchar();
  27. while(ch<'0'||ch>'9'){if(ch=='-')rev=1;ch=getchar();}
  28. while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
  29. return rev?-x:x;
  30. }
  31. double f[N][N],u[N],p[N];
  32. int n,a,b,g[N][N];
  33. void update(double&a,int&b,double c,int d){
  34. if(a+eps<c) a=c,b=d;
  35. }
  36. int calc(double k){
  37. for(int i=1;i<=n;i++)
  38. for(int j=0;j<=a;j++){
  39. f[i][j]=g[i][j]=0;
  40. update(f[i][j],g[i][j],f[i-1][j],g[i-1][j]);
  41. update(f[i][j],g[i][j],f[i-1][j]+u[i]-k,g[i-1][j]+1);
  42. if(!j)continue;
  43. update(f[i][j],g[i][j],f[i-1][j-1]+p[i],g[i-1][j-1]);
  44. 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);
  45. }
  46. return g[n][a];
  47. }
  48. int main(){
  49. #ifdef Devil_Gary
  50. freopen("in.txt","r",stdin);
  51. #endif
  52. cin>>n>>a>>b;
  53. for(int i=1;i<=n;i++) cin>>p[i];
  54. for(int i=1;i<=n;i++) cin>>u[i];
  55. double l=-INF,r=INF;
  56. for(int T=1;T<=100;T++){
  57. double mid=(l+r)/2;
  58. if(calc(mid)<=b) r=mid;
  59. else l=mid;
  60. }
  61. return printf("%.8f\n",f[n][a]+b*l),0;
  62. }

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. cin,cout,printf,scanf效率对比

    From:http://www.cnblogs.com/killerlegend/p/3918452.html Author:KillerLegend Date:2014.8.17 杭电OJ之3233 ...

  2. bzoj千题计划226:bzoj2763: [JLOI2011]飞行路线

    http://www.lydsy.com/JudgeOnline/problem.php?id=2763 这也算分层图最短路? dp[i][j]到城市i,还剩k次免费次数的最短路 #include&l ...

  3. iOS 处理缓存的三种方法

    缓存处理是个相当头疼的事情,要根据需要综合应用不同的策略.总的来说有以下几种情况: 1.URL缓存,例如社交应用的帖子浏览,要在viewDidAppear:里面进行URL缓存.简单来说就是用NSURL ...

  4. 基础图像处理之混合空间增强——(Java:拉普拉斯锐化、Sobel边缘检测、均值滤波、伽马变换)

    相信看过冈萨雷斯第三版数字图像处理的童鞋都知道,里面涉及到了很多的基础图像处理的算法,今天,就专门借用其中一个混合空间增强的案例,来将常见的几种图像处理算法集合起来,看能发生什么样的化学反应 首先,通 ...

  5. Java多线程学习(八)线程池与Executor 框架

    目录 历史优质文章推荐: 目录: 一 使用线程池的好处 二 Executor 框架 2.1 简介 2.2 Executor 框架结构(主要由三大部分组成) 2.3 Executor 框架的使用示意图 ...

  6. flask基础之LocalProxy代理对象(八)

    前言 flask框架自带的代理对象有四个,分别是request,session,g和current_app,各自的含义我们在前面已经详细分析过.使用代理而不是显式的对象的主要目的在于这四个对象使用太过 ...

  7. MySQL Dual-Master 双向同步

    本文介绍的Mysql Dual-Master 复制实施方法可能不是最完美.最强大的.但是在我的应用环境下能很好的满足各项需求. 本文基于我们仅仅使用两台MySQL服务器的情况下,但是你会发现文章中介绍 ...

  8. .net的锁

    一.lock .Monitor  处理并行任务的时候,效率最高的就是多线程.当不同线程需要访问同一资源时候,就需要同步了.就像生活中很多人要一起赶飞机大家都要访问飞机这个资源每个人是一条线程那么就有门 ...

  9. Laravel中服务提供者和门面模式

    在laravel中,我们可能需要用到自己添加的类时,可以建立一个文件夹专门存放类文件,也可以使用laravel的服务提供者的方式来使用. 这两者其实区别不大,主要是前者使用的话,会跟业务代码产生依赖, ...

  10. javaWeb服务器配置

    jdk下载地址:http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-52126 ...