Codeforces739E Gosha is hunting
题意:现在有n个精灵,两种精灵球各m1和m2个,每个精灵单独使用第一种精灵球有pi的概率被捕获,单独使用第二种精灵球有ui的概率被捕获,同时使用有1-(1-pi)*(1-ui)的概率被捕获.一种精灵球在一个精灵身上只能用一次,但你可以在一个精灵上用两种精灵球.求最优策略下期望获得精灵的只数.
如果一只精灵上不能同时用两种精灵球,那么就是一个显然的费用流建图,点A表示第一种精灵球,点B表示第二种精灵球,源点向A,B各连一条流量等于对应精灵球数目的边(费用为0),A,B分别向每个精灵连一条流量为1,费用为对应的pi/ui的边,每个精灵连出一条流量为1的边指向汇点,限制只能用一个精灵球,跑最大费用流即可(这里最大费用流等于最大费用最大流,因为精灵球用得越多期望抓捕的精灵数至少不会减少).
现在我们需要考虑同时使用两种精灵球的情况,但并不能简单地把精灵连向汇点的边流量+1,因为这样相加的时候我们重复计算了两种精灵球都生效的情况,这个概率是pi*ui.
那么我们想法减去多出的一部分即可,同时还要保证只使用一个精灵球的时候不减去这部分,那么我们从每个精灵向汇点引出两条流量为1的边,一条费用为0,一条费用为-pi*ui,使用第一个精灵球时最长路一定走费用为0的边,使用第二个精灵球时必须走第二条边从而去除了重复的情况.跑最大费用流即可.
坑点:这道题的费用是实数,spfa比较大小的时候一定要用eps,不然会卡出TLE….
#include<cstdio>
#include<cstring>
const int maxn=,maxm=;
struct edge{
int to,next,w;double cost;
}lst[maxm];int len=,first[maxn];
void addedge(int a,int b,int w,double cost){
lst[len].to=b;lst[len].next=first[a];lst[len].w=w;lst[len].cost=cost;first[a]=len++;
lst[len].to=a;lst[len].next=first[b];lst[len].w=;lst[len].cost=-cost;first[b]=len++;
}
bool inq[maxn];
int s,t,T,head,tail,q[maxn],vis[maxn],prt[maxn];double dis[maxn];
bool spfa(){
head=tail=;q[tail++]=s;inq[s]=true;
vis[s]=++T;dis[s]=;prt[s]=-;
while(head!=tail){
int x=q[head++];head%=maxn;inq[x]=false;
for(int pt=first[x];pt!=-;pt=lst[pt].next){
if(lst[pt].w==)continue;
if(vis[lst[pt].to]!=T||dis[x]+lst[pt].cost-dis[lst[pt].to]>1e-){//这个地方神坑…直接比较大小TLE到死…
vis[lst[pt].to]=T;dis[lst[pt].to]=dis[x]+lst[pt].cost;
prt[lst[pt].to]=pt;
if(!inq[lst[pt].to]){
inq[lst[pt].to]=true;q[tail++]=lst[pt].to;tail%=maxn;
}
}
}
}
return vis[t]==T;
}
double maxcost(){
double ans=;
while(spfa()&&dis[t]>){
ans+=dis[t];
for(int pt=prt[t];pt!=-;pt=prt[lst[pt^].to]){
lst[pt].w--;lst[pt^].w++;
}
}
return ans;
}
double p[maxn],u[maxn];
int main(){
memset(first,-,sizeof(first));
int n,m1,m2;scanf("%d%d%d",&n,&m1,&m2);
s=;t=n+;
addedge(s,n+,m1,);addedge(s,n+,m2,);
for(int i=;i<=n;++i)scanf("%lf",p+i);
for(int i=;i<=n;++i)scanf("%lf",u+i);
for(int i=;i<=n;++i){
addedge(n+,i,,p[i]);addedge(n+,i,,u[i]);
addedge(i,t,,);addedge(i,t,,-p[i]*u[i]);
}
printf("%.5f\n",maxcost());
return ;
}
Codeforces739E Gosha is hunting的更多相关文章
- 2019.03.12 codeforces739E. Gosha is hunting(dp凸优化)
传送门 题意:nnn个物品,有aaa个XXX道具和bbb个YYY道具,XXX道具移走第iii个物品概率为pip_ipi,YYY道具移走第iii个道具概率为uiu_iui. 对于每个物品每种道具最多 ...
- 【CF739E】Gosha is hunting 贪心
[CF739E]Gosha is hunting 题意:有n个小精灵,你有a个普通球和b个超级球,用普通球抓住第i只小精灵的概率为$A_i$,用超级球抓住第i只小精灵的概率为$u_i$.你必须一开始就 ...
- 【CF739E】Gosha is hunting(动态规划,凸优化)
[CF739E]Gosha is hunting(动态规划,凸优化) 题面 洛谷 CF 题解 一个\(O(n^3)\)的\(dp\)很容易写出来. 我们设\(f[i][a][b]\)表示前\(i\)个 ...
- 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] 最大流由 ...
- Codeforces 749E Gosha is hunting 二分+DP
很神奇的一题 看完题解不由惊叹 题意:$n$个神奇宝贝 $a$个普通球 $b$个高级球 普通球抓住$i$神奇宝贝的概率为$u[i]$ 高级球为$p[i]$ 一起用为$u[i]+p[i]-u[i]*p[ ...
- CF739E Gosha is hunting 【WQS二分 + 期望】
题目链接 CF739E 题解 抓住个数的期望即为概率之和 使用\(A\)的期望为\(p[i]\) 使用\(B\)的期望为\(u[i]\) 都使用的期望为\(p[i] + u[i] - u[i]p[i] ...
- Codeforces.739E.Gosha is hunting(DP 带权二分)
题目链接 \(Description\) 有\(n\)只精灵,两种精灵球(高级和低级),每种球能捕捉到第\(i\)只精灵的概率已知.求用\(A\)个低级球和\(B\)个高级球能捕捉到精灵数的最大期望. ...
- CF 739E Gosha is Hunting
有 $n$ 个 Pokemon,你有 $A$ 个一类精灵球,$B$ 个二类精灵球 分别给出每个 Pokemon 被这两类精灵球捕捉的概率 求抓到 Pokemon 的最优期望个数 $n\leq 2000 ...
随机推荐
- 跑马灯js
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- JAVA中的Transient
Java中的transient,是用于声明序列化的时候不被存储的. 例子: package ThreadTest; /** * Created with IntelliJ IDEA. * User: ...
- jquery 异步请求Demo【转载】
$(document).ready(function() { $.ajax({ url : "/AjaxAction/LoginArea.ashx", data : {userna ...
- [置顶] Firefox OS 学习——Gaia 编译分析
Gaia作为用户的接口,也是用户可见部分,一些用户的应用也是安装在这一层,所以研究他是很有必要的,对于像我这样的初学者,最直接的学习方法就是通过修改代码,然后可以看到UI的变化,很直观的观察修改结果. ...
- python:numpy(文件存取)
NumPy提供了多种存取数组内容的文件操作函数.保存数组数据的文件可以是二进制格式或者文本格式.二进制格式的文件又分为NumPy专用的格式化二进制类型和无格式类型. 一,tofile()和from ...
- java在windows下加载dll
java在类中加载动态链接库文件. 类文件中: static { System.loadLibrary("dll文件"); } dll文件在工程的包路径下.例如:pro/bin/h ...
- 搭建完整邮件系统(postfix+dovecot+clamAV+Spamassassin+amavisd-new)
============================ 相关软件: 1. 发送邮件 --- postfix 2. 身份认证 --- sasl2 3. 接收邮件 --- dovecot 4. 防病毒邮 ...
- android:allowbackup="true"
<application android:allowBackup="false" android:label="@string/app_name"> ...
- OpenStack Neutron DVR L2 Agent的初步解析 (一)
声明: 本博客欢迎转载,但请保留原作者信息! 作者:林凯 团队:华为杭州OpenStack团队 OpenStack Juno版本号已正式公布,这是这个开源云平台的10个版本号,在Juno版的Neutr ...
- Android(java)学习笔记254:ContentProvider使用之内容观察者(观察发出去的短信)
1.新建一个案例如下: 2. 不需要添加权限,同时这里布局文件不做修改,来到MainActivity,如下: package com.itheima.sendsmslistener; import a ...