CF739E Gosha is hunting DP+wqs二分
我是从其他博客里看到这题的,上面说做法是wqs二分套wqs二分?但是我好懒呀,只用了一个wqs二分,于是\(O(nlog^2n)\)→\(O(n^2logn)\)
首先我们有一个\(O(n^3)\)的暴力\(DP\),转移好写,形式优美,但复杂度不对
该怎样发现它的凸性质呢
1.打表√
2.冷静分析一波,每一种球肯定是越多越好,于是我们先固定选择\(a\)个普通球,然后那\(b\)个大师球肯定是从大到小挑选。这样的话每多选一个,新增的收益就会下降一点,也就是说这是个上凸函数。(口胡如果假的话,就锤我吧)√
然后就可以用wqs二分干掉一维啦,设\(f[i][j]\)表示考虑到第\(i\)只精灵,已经选了\(j\)个普通球和若干个大师球时的最大期望,二分一个斜率\(mid\),每次check时转移一下\(f\)数组,拿最优决策点和\(b\)比较来调整范围
细节就是如果有多个相同的\(f\)值,取大师球最多的
代码如下:
#include <bits/stdc++.h>
using namespace std;
//暴力DP:n^3
//wqs二分:n^2logn
#define N 2000
const double eps = 1e-8; //我1e-6的精度被卡掉了。。。
int n, a, b;
double p[N+5], u[N+5], mid;
double sum;
int cnt;
bool dcmp(double x, double y) {
return fabs(x-y) <= eps;
};
struct Data {
double v;
int cnt;
bool operator < (const Data &rhs) const { //方便
return dcmp(v, rhs.v) ? cnt < rhs.cnt : v < rhs.v;
}
}f[N+5][N+5], opt;
Data newData(Data &d, double v, int cnt) {
return Data{d.v+v, d.cnt+cnt};
}
void check() {
for(int i = 1; i <= n; ++i) {
for(int j = 0; j <= a; ++j) {
//分类讨论转移
//1.什么都不选
//2.只选p
//3.只选u
//4.两个都选
//取max
f[i][j] = f[i-1][j];
if(j >= 1) f[i][j] = max(f[i][j], newData(f[i-1][j-1], p[i], 0)); //记得减掉附加权值
f[i][j] = max(f[i][j], newData(f[i-1][j], u[i]-mid, 1));
if(j >= 1) f[i][j] = max(f[i][j], newData(f[i-1][j-1], p[i]+u[i]-p[i]*u[i]-mid, 1));
}
}
opt = f[n][a];
}
int main() {
scanf("%d%d%d", &n, &a, &b);
for(int i = 1; i <= n; ++i) scanf("%lf", &p[i]);
for(int i = 1; i <= n; ++i) scanf("%lf", &u[i]);
double l = 0, r = 1, slope = r;
while(fabs(r-l) > eps) { //二分斜率
mid = (l+r)*0.5;
check();
if(opt.cnt >= b) l = mid, slope = mid;
else r = mid;
}
mid = slope;
check();
printf("%.5lf\n", opt.v+b*slope);
return 0;
}
CF739E Gosha is hunting DP+wqs二分的更多相关文章
- CF739E Gosha is hunting 【WQS二分 + 期望】
题目链接 CF739E 题解 抓住个数的期望即为概率之和 使用\(A\)的期望为\(p[i]\) 使用\(B\)的期望为\(u[i]\) 都使用的期望为\(p[i] + u[i] - u[i]p[i] ...
- 【CF739E】Gosha is hunting(WQS二分套WQS二分)
点此看题面 大致题意: 你有两种捕捉球(分别为\(A\)个和\(B\)个),要捕捉\(n\)个神奇宝贝,第\(i\)个神奇宝贝被第一种球捕捉的概率是\(s1_i\),被第二种球捕捉的概率是\(s2_i ...
- Codeforces.739E.Gosha is hunting(DP 带权二分)
题目链接 \(Description\) 有\(n\)只精灵,两种精灵球(高级和低级),每种球能捕捉到第\(i\)只精灵的概率已知.求用\(A\)个低级球和\(B\)个高级球能捕捉到精灵数的最大期望. ...
- 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] 最大流由 ...
- [九省联考2018]林克卡特树(DP+wqs二分)
对于k=0和k=1的点,可以直接求树的直径. 然后对于60分,有一个重要的转化:就是求在树中找出k+1条点不相交的链后的最大连续边权和. 这个DP就好.$O(nk^2)$ 然后我们完全不可以想到,将b ...
- HZOJ 赤(CF739E Gosha is hunting)
本来没有打算写题解的,时间有点紧.但是这个wqs二分看了好久才明白还是写点东西吧. 题解就直接粘dg的了: 赤(red) 本题来自codeforces 739E,加大了数据范围. 首先对一只猫不会扔两 ...
- P4383 [八省联考2018]林克卡特树 树形dp Wqs二分
LINK:林克卡特树 作为树形dp 这道题已经属于不容易的级别了. 套上了Wqs二分 (反而更简单了 大雾 容易想到还是对树进行联通情况的dp 然后最后结果总和为各个联通块内的直径. \(f_{i,j ...
- CF739E Gosha is hunting(费用流/凸优化dp)
纪念合格考爆炸. 其实这个题之前就写过博客了,qwq但是不小心弄丢了,所以今天来补一下. 首先,一看到球的个数的限制,不难相当用网络流的流量来限制每个球使用的数量. 由于涉及到最大化期望,所以要使用最 ...
- CF739E Gosha is hunting(费用流,期望)
根据期望的线性性答案就是捕捉每一只精灵的概率之和. 捕捉一只精灵的方案如下: 1.使用一个\(A\)精灵球,贡献为\(A[i]\) 2.使用一个\(B\)精灵球,贡献为\(B[i]\) 3.使用一个\ ...
随机推荐
- VSCode瞎折腾记
搬到小机房后终于能用VSCode啦(没错以前的系统是xp) 但是这东西比Dev难搞多了qwq,简单记一下自己的DIY历程吧(不然全搞炸就凉了) 设置语言为中文 可以直接下载插件 让VSCode支持编译 ...
- jsp内置对象-pageContext对象
1.概念:pageContext对象能够获取JSP页面中的request.response.session.application等其他内置对象.pageContext对象的创建和初始化由容器完成,可 ...
- 关于写作那些事之github告诉我构建失败,然后呢?
The page build failed for the master branch with the following error 问题描述 看到这封邮件,一脸懵逼,本地运行 gitbook 服 ...
- 【English】八、食物相关
一.beer.wine.coffee.soup.oil.juice beer 啤酒 They drink beer. wine 葡萄酒 Wine and coffee. coffee 咖啡 Wine ...
- Postman学习之【压力测试】
Postman请自行下载 下面是在网上随便抓了一个请求地址来做演示,把请求地址填入地址栏,此请求为GET请求.点击Send发送请求,请求结果将会在下方显示出来.每次的请求历史数据,会被记录下来,但是经 ...
- 数据库原理剖析 - 序列1 - B+树
本文节选自<软件架构设计:大型网站技术架构与业务架构融合之道>第6.3章节. 作者微信公众号: 架构之道与术.进入后,可以加入书友群,与作者和其他读者进行深入讨论.也可以在京东.天猫上购买 ...
- C#多线程和线程池 【转】
1.概念 1.0 线程的和进程的关系以及优缺点 windows系统是一个多线程的操作系统.一个程序至少有一个进程,一个进程至少有一个线程.进程是线程的容器,一个C#客户端程序开始于一个单独的线程,C ...
- python函数与函数式编程
https://www.cnblogs.com/evablogs/p/6699515.html 在理解函数式编程之前,我还是对函数的调用,参数传递以及函数的嵌套调用一头雾水,还是花了点时间整理了写思绪 ...
- ORACLE复制表结构
一般网上的方法: ; --复制表结构以及数据按where条件查询出的数据 ; --只复制表结构 但是上面的语法不会复制旧表的默认值.注释.键和索引,因此想要完美的复制表结构就需要先找到旧表的sql语句 ...
- Java设置接口跨域
现在我们很多项目都是基于Java的REST结构风格前后端分离,在前端访问后端的时候就存在跨域,这个时候后端接口不处理就会存在访问不了.上代码! 1.创建一个Filter 在web.xml中配置 < ...