我是从其他博客里看到这题的,上面说做法是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二分的更多相关文章

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

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

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

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

  3. Codeforces.739E.Gosha is hunting(DP 带权二分)

    题目链接 \(Description\) 有\(n\)只精灵,两种精灵球(高级和低级),每种球能捕捉到第\(i\)只精灵的概率已知.求用\(A\)个低级球和\(B\)个高级球能捕捉到精灵数的最大期望. ...

  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. [九省联考2018]林克卡特树(DP+wqs二分)

    对于k=0和k=1的点,可以直接求树的直径. 然后对于60分,有一个重要的转化:就是求在树中找出k+1条点不相交的链后的最大连续边权和. 这个DP就好.$O(nk^2)$ 然后我们完全不可以想到,将b ...

  6. HZOJ 赤(CF739E Gosha is hunting)

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

  7. P4383 [八省联考2018]林克卡特树 树形dp Wqs二分

    LINK:林克卡特树 作为树形dp 这道题已经属于不容易的级别了. 套上了Wqs二分 (反而更简单了 大雾 容易想到还是对树进行联通情况的dp 然后最后结果总和为各个联通块内的直径. \(f_{i,j ...

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

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

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

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

随机推荐

  1. ArcGIS API for JavaScript与 npm

    在4.7版本中,不仅增加了WebGL的渲染支持(渲染前端速度加快,渲染量也加大).增强了ES6中的Promises语法支持,还支持了npm管理及webpack打包,实属喜讯. “意味着可以不经过esr ...

  2. 生鲜配送管理系统_升鲜宝V2.0 小标签打印功能【代配送商品打印小标签功能】说明_15382353715

    小标签打印说明 小标签打印可以打印本系统的订单商品数量,也可以把外部的订单商品导入本系统进行打印. 打印本系统中的订单商品操作说明[上篇文章已经讲解相关的操作说明] 打印本系统之外的订单商品明细清单 ...

  3. 新坑:c#弄微信公众号

    微信公众号作为一个平台级别的产品,对商业应用来说,有很大的吸引力.如何让公众号更好的吸粉?靠内容不是一般小商户可以做到的,那是网红自媒体的强项.一般商户要怎么突围?那就是提供实用,有意义的功能给粉丝. ...

  4. 字符串按照Z旋转90度然后上下翻转的字形按行输出字符串--ZigZag Conversion

    The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...

  5. 搭建 structs2 环境

    前言 环境: window 10 ,JDK 1.8 ,Tomcat 7 ,MyEclipse 2014 pro 搭建 SSH 环境的步骤 创建 JavaWeb 项目 导入 structs2 的jar包 ...

  6. WebStrom中实现Vue项目的快速启动

    工具:WebStrom+vue 前提:你已经安装了node.js,vuejs,会创建vue项目等一系列的操作 发生场景:希望在WebStrom中能够快速启动vue的项目,省去npm install,  ...

  7. HTML基础-------HTML标签(2)

    HTML标签(2) a标签(容器级单标签) 语义:跳转到指定的连接 属性 列表系列 1.无序列表 该列表由两部分组成:ul标签嵌套li标签(ul标签是典型的容器级标签) 图示: 2.有序列表 该列表由 ...

  8. 我的Scala之路(1):列表List操作

    List() 或 Nil 空 List List("Cool", "tools", "rule) 创建带有三个值"Cool",&q ...

  9. java 向上向下取整

    Math.floor(1.4)=1.0 Math.round(1.4)=1 Math.ceil(1.4)=2.0 Math.floor(1.5)=1.0 Math.round(1.5)=2 Math. ...

  10. 转://从一条巨慢SQL看基于Oracle的SQL优化

    http://mp.weixin.qq.com/s/DkIPwbDKIjH2FMN13GkT4w 本次分享的内容是基于Oracle的SQL优化,以一条巨慢的SQL为例,从快速解读SQL执行计划.如何从 ...