【CF739E】Gosha is hunting

题意:有n个小精灵,你有a个普通球和b个超级球,用普通球抓住第i只小精灵的概率为$A_i$,用超级球抓住第i只小精灵的概率为$u_i$。你必须一开始就决定向哪些精灵投掷哪些精灵球,同种的球只能对一个精灵用一次,可以对一只精灵投掷两种球,如果两次中有一次抓到则视为抓到。问你如果采用最优的方案,最终抓到小精灵的期望个数是多少。

$n\le 2000$。

题解:我们先将所有小精灵按$B$排序,然后我们枚举最后一个投b或ab的小精灵i,那么不难证明i左边的所有小精灵都是b或a或ab,i右面的小精灵都是0或a。接着我们想把左面的三种情况拆开,不难发现$A_x+B_x-A_xB_x+B_y>B_x+A_y+B_y-A_yB_y$->$(1-B_x)A_x>(1-B_y)A_y$,所以只要将i左边按$(1-B)A$排序,然后就可以枚举j,满足[1,j]都是ab或b,(j,i]都是a或b。此时我们就可以先假设[1,i]全选b,则[1,j]中每个点选ab的贡献就是$A-AB$,(j,i]中每个点选a的贡献就是$A-B$,(i,n]中每个点选a的贡献是$A$。我们只需要用一个数据结构维护前k大值的和即可。用treap比较容易,当然我懒,用的是两个对顶的堆来维护。

时间复杂度$O(n^2\log n)$。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <queue>
  6. #define lson x<<1
  7. #define rson x<<1|1
  8. using namespace std;
  9. const int maxn=2010;
  10. int n,A,B;
  11. double ans,sum;
  12. struct node
  13. {
  14. double a,b,c;
  15. }p[maxn];
  16. struct heap
  17. {
  18. priority_queue<double> a,b;
  19. inline double top()
  20. {
  21. while(!b.empty()&&a.top()==b.top()) a.pop(),b.pop();
  22. return a.top();
  23. }
  24. inline int size() {return a.size()-b.size();}
  25. inline void erase(double x) {b.push(x);}
  26. inline void push(double x) {a.push(x);}
  27. inline void pop()
  28. {
  29. while(!b.empty()&&a.top()==b.top()) a.pop(),b.pop();
  30. a.pop();
  31. }
  32. inline void clr()
  33. {
  34. while(!a.empty()) a.pop();
  35. while(!b.empty()) b.pop();
  36. }
  37. };
  38. struct bst
  39. {
  40. heap p1,p2;
  41. int lim;
  42. inline void insert(double x)
  43. {
  44. p1.push(-x),sum+=x;
  45. if(p1.size()>lim) p2.push(-p1.top()),sum+=p1.top(),p1.pop();
  46. }
  47. inline void del(double x)
  48. {
  49. if(x<=p2.top()) p2.erase(x);
  50. else
  51. {
  52. sum-=x,p1.erase(-x);
  53. if(p1.size()<lim&&p2.size()) p1.push(-p2.top()),sum+=p2.top(),p2.pop();
  54. }
  55. }
  56. inline void clr() {p1.clr(),p2.clr();}
  57. }b1,b2;
  58. bool cmp1(const node &a,const node &b)
  59. {
  60. return a.b>b.b;
  61. }
  62. bool cmp2(const node &a,const node &b)
  63. {
  64. return (1-a.a)*a.b>(1-b.a)*b.b;
  65. }
  66. int main()
  67. {
  68. scanf("%d%d%d",&n,&A,&B);
  69. int i,j;
  70. for(i=1;i<=n;i++) scanf("%lf",&p[i].a);
  71. for(i=1;i<=n;i++) scanf("%lf",&p[i].b),p[i].c=1-(1-p[i].a)*(1-p[i].b);
  72. sort(p+1,p+n+1,cmp1);
  73. double sumb=0;
  74. for(i=1;i<B;i++) sumb+=p[i].b;
  75. for(i=B;i<=min(n,A+B);i++)
  76. {
  77. sumb+=p[i].b;
  78. b1.clr(),b2.clr(),b1.lim=A-i+B,b2.lim=i-B,sum=0;
  79. sort(p+1,p+i+1,cmp2);
  80. for(j=1;j<=i;j++) b2.insert(p[j].a-p[j].b);
  81. for(j=i+1;j<=n;j++) b1.insert(p[j].a);
  82. ans=max(ans,sumb+sum);
  83. for(j=1;j<=B;j++)
  84. {
  85. b2.del(p[j].a-p[j].b),b1.insert(p[j].c-p[j].b);
  86. ans=max(ans,sumb+sum);
  87. }
  88. }
  89. printf("%.6lf",ans);
  90. return 0;
  91. }

【CF739E】Gosha is hunting 贪心的更多相关文章

  1. CF739E Gosha is hunting 【WQS二分 + 期望】

    题目链接 CF739E 题解 抓住个数的期望即为概率之和 使用\(A\)的期望为\(p[i]\) 使用\(B\)的期望为\(u[i]\) 都使用的期望为\(p[i] + u[i] - u[i]p[i] ...

  2. HZOJ 赤(CF739E Gosha is hunting)

    本来没有打算写题解的,时间有点紧.但是这个wqs二分看了好久才明白还是写点东西吧. 题解就直接粘dg的了: 赤(red) 本题来自codeforces 739E,加大了数据范围. 首先对一只猫不会扔两 ...

  3. CF739E Gosha is hunting DP+wqs二分

    我是从其他博客里看到这题的,上面说做法是wqs二分套wqs二分?但是我好懒呀,只用了一个wqs二分,于是\(O(nlog^2n)\)→\(O(n^2logn)\) 首先我们有一个\(O(n^3)\)的 ...

  4. CF739E Gosha is hunting

    法一: 匹配问题,网络流! 最大费用最大流,S到A,B流a/b费0,A,B到i流1费p[i]/u[i],同时选择再减p[i]*u[i]? 连二次!所以i到T流1费0流1费-p[i]*u[i] 最大流由 ...

  5. CF739E Gosha is hunting(费用流,期望)

    根据期望的线性性答案就是捕捉每一只精灵的概率之和. 捕捉一只精灵的方案如下: 1.使用一个\(A\)精灵球,贡献为\(A[i]\) 2.使用一个\(B\)精灵球,贡献为\(B[i]\) 3.使用一个\ ...

  6. CF739E Gosha is hunting(费用流/凸优化dp)

    纪念合格考爆炸. 其实这个题之前就写过博客了,qwq但是不小心弄丢了,所以今天来补一下. 首先,一看到球的个数的限制,不难相当用网络流的流量来限制每个球使用的数量. 由于涉及到最大化期望,所以要使用最 ...

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

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

  8. 【CF739E】Gosha is hunting(WQS二分套WQS二分)

    点此看题面 大致题意: 你有两种捕捉球(分别为\(A\)个和\(B\)个),要捕捉\(n\)个神奇宝贝,第\(i\)个神奇宝贝被第一种球捕捉的概率是\(s1_i\),被第二种球捕捉的概率是\(s2_i ...

  9. codeforces 739E - Gosha is hunting

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

随机推荐

  1. ecshop安装

    ECSHOP开发中心(www.68ecshop.com) 1.下载ecshop程序包,下载地址: http://download.ecshop.com/2.7.3/ECShop_V2.7.3_UTF8 ...

  2. 用Python写简单的爬虫

    准备: 1.扒网页,根据URL来获取网页信息 import urllib.parse import urllib.request response = urllib.request.urlopen(& ...

  3. 实现一个div,左边固定div宽度200px,右边div自适应

    实现一个div,左边固定div宽度200px,右边div自适应<div class= "container"> <div class="left&quo ...

  4. go 类型转换

    https://studygolang.com/articles/3400 https://studygolang.com/articles/6633

  5. js获取iframe里面的元素

    直接获取不行 var  win2 = document.querySelector('iframe[width = "1280" ]').contentWindow; var lo ...

  6. linux下jdk简单配置记录

    记录哈,搭建环境的时候,copy使用方便. vim /etc/profile export JAVA_HOME=/usr/java/jdk1.7.0_79export PATH=$JAVA_HOME/ ...

  7. Nginx(十)-- 进程模型及工作原理

    1.nginx进程模型 Nginx是一个master和worker的模型.master主要用来管理worker进程,master就比作老板,worker就是打工仔,master指挥worker来做事情 ...

  8. springboot 集成elasticsearch5.4.3

    官网上对elasticsearch 的集成用的是spring-data,而且,暂时不支持5.x的版本, 要是想集成5.x的版本,我们只能在pom.xml文件中进行修改,如图: <project ...

  9. es5.0 安装head插件

    es5.0的安装和之前的版本有些区别,我的电脑用plugin install 没成功, 查了一下资料,说是可以用grunt进行安装,启动; 1,先安装grunt: grunt是一个很方便的构建工具,可 ...

  10. Couldn’t load locSDK3

    在项目的libs目录下新建一个文件夹,命名为armeabi-v7a,然后将liblocSDK3.so复制一份到该文件夹 ok