CF739E Gosha is hunting 【WQS二分 + 期望】
题目链接
题解
抓住个数的期望即为概率之和
使用\(A\)的期望为\(p[i]\)
使用\(B\)的期望为\(u[i]\)
都使用的期望为\(p[i] + u[i] - u[i]p[i]\)
当然是用越多越好
但是他很烦地给了个上限,我们就需要作出选择了
有一个很明显的\(O(n^3)\)的\(dp\),显然过不了
但我们有一个很好的\(WQS\)二分
我们非常想去掉这个上限
那就去掉吧,但是每用一次都要付出一个代价
我们二分这个代价,当使用次数恰好为为\(a\)和\(b\)时就是答案
再加回付出的代价即可
非常巧妙地变成了\(O(n\log^2n)\)
这种二分技巧非常棒
当我们求的东西有一个限制个数时,可以通过设置代价去掉上限
//Mychael
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<cmath>
#include<map>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define cls(s,v) memset(s,v,sizeof(s))
#define mp(a,b) make_pair<int,int>(a,b)
#define cp pair<int,int>
#define eps 1e-9
using namespace std;
const int maxn = 2005,maxm = 100005,INF = 0x3f3f3f3f;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = 0; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 1) + (out << 3) + c - 48; c = getchar();}
return flag ? out : -out;
}
int n,a,b,cnta,cntb;
double p[maxn],u[maxn],A,B,ans;
int work(double cost){
A = cost; cnta = cntb = 0; ans = 0;
int sol; double val;
REP(i,n){
val = 0; sol = 0;
if (p[i] - A > val) sol = 1,val = p[i] - A;
if (u[i] - B > val) sol = 2,val = u[i] - B;
if (p[i] + u[i] - u[i] * p[i] - A - B > val)
sol = 3,val = p[i] + u[i] - u[i] * p[i] - A - B;
if (sol == 1 || sol == 3) cnta++;
if (sol == 2 || sol == 3) cntb++;
ans += val;
}
return cnta;
}
int check(double cost){
B = cost;
double l = 0,r = 1.0,mid;
while (r - l > eps){
mid = (l + r) / 2.0;
if (work(mid) <= a) r = mid;
else l = mid;
}
work(r);
A = l;
return cntb;
}
int main(){
n = read(); a = read(); b = read();
REP(i,n) scanf("%lf",&p[i]);
REP(i,n) scanf("%lf",&u[i]);
double l = 0,r = 1.0,mid;
while (r - l > eps){
mid = (l + r) / 2.0;
if (check(mid) <= b) r = mid;
else l = mid;
}
check(r);
printf("%.8lf",ans + a * A + b * B);
return 0;
}
CF739E Gosha is hunting 【WQS二分 + 期望】的更多相关文章
- CF739E Gosha is hunting DP+wqs二分
我是从其他博客里看到这题的,上面说做法是wqs二分套wqs二分?但是我好懒呀,只用了一个wqs二分,于是\(O(nlog^2n)\)→\(O(n^2logn)\) 首先我们有一个\(O(n^3)\)的 ...
- HZOJ 赤(CF739E Gosha is hunting)
本来没有打算写题解的,时间有点紧.但是这个wqs二分看了好久才明白还是写点东西吧. 题解就直接粘dg的了: 赤(red) 本题来自codeforces 739E,加大了数据范围. 首先对一只猫不会扔两 ...
- 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但是不小心弄丢了,所以今天来补一下. 首先,一看到球的个数的限制,不难相当用网络流的流量来限制每个球使用的数量. 由于涉及到最大化期望,所以要使用最 ...
- [总结] wqs二分学习笔记
论文 提出问题 在某些题目中,强制规定只能选 \(k\) 个物品,选多少个和怎么选都会影响收益,问最优答案. 算法思想 对于上述描述的题目,大部分都可以通过枚举选择物品的个数做到 \(O(nk^2)\ ...
- wqs二分
今天模拟赛有一道林克卡特树,完全没有思路 赛后想了一想,不就是求\(k+1\)条不相交的链,使其权值之和最大嘛,傻了. 有一个最裸的\(DP\),设\(f[i][j][k]\)表示在以\(i\)为根的 ...
- 决策单调性&wqs二分
其实是一个还算 trivial 的知识点吧--早在 2019 年我就接触过了,然鹅当时由于没认真学并没有把自己学懂,故今复学之( 1. 决策单调性 引入:在求解 DP 问题的过程中我们常常遇到这样的问 ...
- 【CF739E】Gosha is hunting(WQS二分套WQS二分)
点此看题面 大致题意: 你有两种捕捉球(分别为\(A\)个和\(B\)个),要捕捉\(n\)个神奇宝贝,第\(i\)个神奇宝贝被第一种球捕捉的概率是\(s1_i\),被第二种球捕捉的概率是\(s2_i ...
随机推荐
- Unity 几何着色器
Unity 几何着色器 shaderGeometry Shader几何着色器 Unity 几何着色器 如果学习不能带来价值,那将毫无意义 简介 在顶点和片段着色器之间有一个可选的着色器,叫做几 ...
- jsp servlet路径问题
最近做小作业时饱受路径问题的困扰,记录一下: 当工程目录如上所示时,路径应该这么写: 情况1:根目录下 login.jsp中的表单提交给Servlet时,可以直接写Servlet名: <form ...
- java 实现验证码功能
所需文件以及技术: · SecurityUtil.java (后面我会复制给大家) · 图像处理技术 · 向客户端输出io流 一,实现的原理,当视图页面加载的时候通过<img >元素的 ...
- 启动Nodejs服务
vs code 中间创建 1. settings.json { , { , { 'Content-Type': 'text/plain;charset=utf-8' })
- 数据库之python操作mysql
目录 一.pymysql 二.SQLAchemy 2.操作使用 (1)连接数据库 (2)执行原生SQL语句 (3)ORM操作-数据表操作 (4)ORM操作-数据行操作 (5)更多例子 一.pymysq ...
- Navicat将oracle中数据复制到mysql
1,首先两个数据库都要处于连接状态 2,工具 -- 数据传输 3,选择来源数据库以及要传输的表和目标数据库 4,点击开始 PS:遇到一个问题:[Err] [Dtf] 1426 - Too-big pr ...
- Hibernate笔记③--集合映射、组合映射、联合主键、查询案例
lazy 懒加载 默认为proxy 继承映射 discriminant column="type" type="string" 集合映射 生成表的语句: ...
- Hibernate笔记①--myeclipse制动配置hibernate
Hibernate 是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JD ...
- 6/12 sprint2 看板和燃尽图的更新
- beta发布简评
第一组:新蜂小组 题目:俄罗斯方块 评论:主体功能已经完成,可以流畅的进行游戏,无论效果或是功能都实现的很好. 第二组:Nice团队 题目:约跑APP(约吧) 评论:作为应用,想法创意很好:功能实现上 ...