【CF739E】Gosha is hunting 贪心
【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)$。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
#define lson x<<1
#define rson x<<1|1
using namespace std;
const int maxn=2010;
int n,A,B;
double ans,sum;
struct node
{
double a,b,c;
}p[maxn];
struct heap
{
priority_queue<double> a,b;
inline double top()
{
while(!b.empty()&&a.top()==b.top()) a.pop(),b.pop();
return a.top();
}
inline int size() {return a.size()-b.size();}
inline void erase(double x) {b.push(x);}
inline void push(double x) {a.push(x);}
inline void pop()
{
while(!b.empty()&&a.top()==b.top()) a.pop(),b.pop();
a.pop();
}
inline void clr()
{
while(!a.empty()) a.pop();
while(!b.empty()) b.pop();
}
};
struct bst
{
heap p1,p2;
int lim;
inline void insert(double x)
{
p1.push(-x),sum+=x;
if(p1.size()>lim) p2.push(-p1.top()),sum+=p1.top(),p1.pop();
}
inline void del(double x)
{
if(x<=p2.top()) p2.erase(x);
else
{
sum-=x,p1.erase(-x);
if(p1.size()<lim&&p2.size()) p1.push(-p2.top()),sum+=p2.top(),p2.pop();
}
}
inline void clr() {p1.clr(),p2.clr();}
}b1,b2;
bool cmp1(const node &a,const node &b)
{
return a.b>b.b;
}
bool cmp2(const node &a,const node &b)
{
return (1-a.a)*a.b>(1-b.a)*b.b;
}
int main()
{
scanf("%d%d%d",&n,&A,&B);
int i,j;
for(i=1;i<=n;i++) scanf("%lf",&p[i].a);
for(i=1;i<=n;i++) scanf("%lf",&p[i].b),p[i].c=1-(1-p[i].a)*(1-p[i].b);
sort(p+1,p+n+1,cmp1);
double sumb=0;
for(i=1;i<B;i++) sumb+=p[i].b;
for(i=B;i<=min(n,A+B);i++)
{
sumb+=p[i].b;
b1.clr(),b2.clr(),b1.lim=A-i+B,b2.lim=i-B,sum=0;
sort(p+1,p+i+1,cmp2);
for(j=1;j<=i;j++) b2.insert(p[j].a-p[j].b);
for(j=i+1;j<=n;j++) b1.insert(p[j].a);
ans=max(ans,sumb+sum);
for(j=1;j<=B;j++)
{
b2.del(p[j].a-p[j].b),b1.insert(p[j].c-p[j].b);
ans=max(ans,sumb+sum);
}
}
printf("%.6lf",ans);
return 0;
}
【CF739E】Gosha is hunting 贪心的更多相关文章
- CF739E Gosha is hunting 【WQS二分 + 期望】
题目链接 CF739E 题解 抓住个数的期望即为概率之和 使用\(A\)的期望为\(p[i]\) 使用\(B\)的期望为\(u[i]\) 都使用的期望为\(p[i] + u[i] - u[i]p[i] ...
- HZOJ 赤(CF739E Gosha is hunting)
本来没有打算写题解的,时间有点紧.但是这个wqs二分看了好久才明白还是写点东西吧. 题解就直接粘dg的了: 赤(red) 本题来自codeforces 739E,加大了数据范围. 首先对一只猫不会扔两 ...
- CF739E Gosha is hunting DP+wqs二分
我是从其他博客里看到这题的,上面说做法是wqs二分套wqs二分?但是我好懒呀,只用了一个wqs二分,于是\(O(nlog^2n)\)→\(O(n^2logn)\) 首先我们有一个\(O(n^3)\)的 ...
- 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] 最大流由 ...
- CF739E Gosha is hunting(费用流,期望)
根据期望的线性性答案就是捕捉每一只精灵的概率之和. 捕捉一只精灵的方案如下: 1.使用一个\(A\)精灵球,贡献为\(A[i]\) 2.使用一个\(B\)精灵球,贡献为\(B[i]\) 3.使用一个\ ...
- CF739E Gosha is hunting(费用流/凸优化dp)
纪念合格考爆炸. 其实这个题之前就写过博客了,qwq但是不小心弄丢了,所以今天来补一下. 首先,一看到球的个数的限制,不难相当用网络流的流量来限制每个球使用的数量. 由于涉及到最大化期望,所以要使用最 ...
- 【CF739E】Gosha is hunting(动态规划,凸优化)
[CF739E]Gosha is hunting(动态规划,凸优化) 题面 洛谷 CF 题解 一个\(O(n^3)\)的\(dp\)很容易写出来. 我们设\(f[i][a][b]\)表示前\(i\)个 ...
- 【CF739E】Gosha is hunting(WQS二分套WQS二分)
点此看题面 大致题意: 你有两种捕捉球(分别为\(A\)个和\(B\)个),要捕捉\(n\)个神奇宝贝,第\(i\)个神奇宝贝被第一种球捕捉的概率是\(s1_i\),被第二种球捕捉的概率是\(s2_i ...
- codeforces 739E - Gosha is hunting
这道题有三种做法,感受一下: 感觉到了歪果仁费尽脑汁想出来的神仙贪心脑洞题被中国人套路算法踩爆的凄凉...(我的名字是不是暴露了我的真实实力) ============================ ...
随机推荐
- EasyUI的功能树之异步树
最近几个项目都用到了EasyUI这个Jquery框架,目前感觉起来还是很好使的,展示效果很好,帮助文档什么的资料很多,而且互联网上Easy粉很多,大多数拥护和喜爱EasyUI的粉丝们都愿意在网络平台互 ...
- JUnit 3一个例子就懂
JUnit is a simple framework to write repeatable tests. It is an instance of the xUnit architecture f ...
- 给NSMutableArray添加copy属性就变成了NSArray
-copy, as implemented by mutable Cocoa classes, always returns their immutable counterparts. Thus, w ...
- Android Material Design控件学习(三)——使用TextInputLayout实现酷市场登录效果
前言 前两次,我们学习了 Android Material Design控件学习(一)--TabLayout的用法 Android Material Design控件学习(二)--Navigation ...
- UML的学习
1.什么是UML? 统一建模语言(UML,英语:Unified Modeling Language)是非专利的第三代建模和规约语言.UML是一种开放的方法,用于说明.可视化.构建和编写一个正在开发的. ...
- Java高级面试题及答案
List和Set比较,各自的子类比较 对比一:Arraylist与LinkedList的比较 1.ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高 ...
- 制作做最小的fedora、ubuntu , jeos系统
之前做过, 2018年4月底,最新的fedora28 .ubuntu18.04发布后,自己又尝试做了下. ubuntu的成功了,比较简单: fedora的其实不用自己去制作,直接定制官方的Atomic ...
- centos7 Minimal安装没有ifconfig
centos7 Minimal 安装后 ip addr 系统的网卡没有分配IP地址 网卡为ens33 cd /etc/sysconfig/network-scripts vi ifcfg-ens33 ...
- win7 、2008 提示Error 1606 Could Not Access Network Location %SystemDrive%/inetpub/wwwroot/ 的错误解决方法
在安装控件过程中出现提示Error 1606 Could Not Access Network Location %SystemDrive%/inetpub/wwwroot/ 的错误解决方法 1. 点 ...
- golang 内存分析/动态追踪
如果你的go程序是用http包启动的web服务器,你想查看自己的web服务器的状态.这个时候就可以选择net/http/pprof.你只需要引入包_"net/http/pprof" ...