传送门

题意:nnn个物品,有aaa个XXX道具和bbb个YYY道具,XXX道具移走第iii个物品概率为pip_ipi​,YYY道具移走第iii个道具概率为uiu_iui​。

对于每个物品每种道具最多用一次且只能被移走一次,现在问对于道具的所有分配方案中移走物品的总个数的期望最大值是多少。


思路:

有一个很显然的O(n3)dp:fi,j,kO(n^3)dp:f_{i,j,k}O(n3)dp:fi,j,k​表示前iii个物品用jjj个XXX道具和kkk个YYY道具的最大期望。

然后暴力代码如下:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int rlen=1<<18|1;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=((ans<<2)+ans<<1)+(ch^48),ch=getchar();
	return ans;
}
const int N=205;
int n,a,b;
double p[N],u[N],f[N][N][N];
int main(){
	n=read(),a=read(),b=read();
	for(ri i=1;i<=n;++i)scanf("%lf",&p[i]);
	for(ri i=1;i<=n;++i)scanf("%lf",&u[i]);
	for(ri i=1;i<=n;++i){
		for(ri j=0;j<=a;++j)for(ri k=0;k<=b;++k){
			f[i][j][k]=f[i-1][j][k];
			if(j)f[i][j][k]=max(f[i][j][k],f[i-1][j-1][k]+p[i]);
			if(k)f[i][j][k]=max(f[i][j][k],f[i-1][j][k-1]+u[i]);
			if(j&&k)f[i][j][k]=max(f[i][j][k],f[i-1][j-1][k-1]+1-(1-p[i])*(1-u[i]));
		}
	}
	printf("%.6lf",f[n][a][b]);
	return 0;
}

然而这显然是不够优秀的

因此我们发现可以对后两维都进行一次凸优化,复杂度O(nlogn2)O(nlog_n^2)O(nlogn2​)

代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=((ans<<2)+ans<<1)+(ch^48),ch=getchar();
	return ans;
}
const double eps=1e-8;
const int N=2005;
int n,a,b;
double p[N],u[N];
struct data{
	double v;
	int a,b;
	data(double v=0,int a=0,int b=0):v(v),a(a),b(b){}
	friend inline data operator+(const data&a,const data&b){return data(a.v+b.v,a.a+b.a,a.b+b.b);}
}f[N];
inline void solve(double w1,double w2){
	f[0]=data(0,0,0);
	for(ri i=1;i<=n;++i){
		f[i]=f[i-1];
		if(f[i-1].v+p[i]-w1>f[i].v)f[i]=f[i-1]+data(p[i]-w1,1,0);
		if(f[i-1].v+u[i]-w2>f[i].v)f[i]=f[i-1]+data(u[i]-w2,0,1);
		if(f[i-1].v+p[i]+u[i]-p[i]*u[i]-w1-w2>f[i].v)f[i]=f[i-1]+data(p[i]+u[i]-p[i]*u[i]-w1-w2,1,1);
	}
}
int main(){
	n=read(),a=read(),b=read();
	for(ri i=1;i<=n;++i)scanf("%lf",&p[i]);
	for(ri i=1;i<=n;++i)scanf("%lf",&u[i]);
	double l1=0,r1=1,l2,r2;
	while(r1-l1>=eps){
		double mid1=(l1+r1)/2;
		l2=0,r2=1;
		while(r2-l2>=eps){
			double mid2=(l2+r2)/2;
			solve(mid1,mid2);
			f[n].b>b?l2=mid2:r2=mid2;
		}
		solve(mid1,r2);
		f[n].a>a?l1=mid1:r1=mid1;
	}
	solve(r1,r2);
	printf("%.6lf",f[n].v+r1*a+r2*b);
	return 0;
}

2019.03.12 codeforces739E. Gosha is hunting(dp凸优化)的更多相关文章

  1. 【Codeforces 321E / BZOJ 5311】【DP凸优化】【单调队列】贞鱼

    目录 题意: 输入格式 输出格式 思路: DP凸优化的部分 单调队列转移的部分 坑点 代码 题意: 有n条超级大佬贞鱼站成一行,现在你需要使用恰好k辆车把它们全都运走.要求每辆车上的贞鱼在序列中都是连 ...

  2. 「学习笔记」wqs二分/dp凸优化

    [学习笔记]wqs二分/DP凸优化 从一个经典问题谈起: 有一个长度为 \(n\) 的序列 \(a\),要求找出恰好 \(k\) 个不相交的连续子序列,使得这 \(k\) 个序列的和最大 \(1 \l ...

  3. dp凸优化/wqs二分学习笔记(洛谷4383 [八省联考2018]林克卡特树lct)

    qwq 安利一个凸优化讲的比较好的博客 https://www.cnblogs.com/Gloid/p/9433783.html 但是他的暴力部分略微有点问题 qwq 我还是详细的讲一下这个题+这个知 ...

  4. CF739E Gosha is hunting DP+wqs二分

    我是从其他博客里看到这题的,上面说做法是wqs二分套wqs二分?但是我好懒呀,只用了一个wqs二分,于是\(O(nlog^2n)\)→\(O(n^2logn)\) 首先我们有一个\(O(n^3)\)的 ...

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

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

  6. Codeforces739E Gosha is hunting

    题意:现在有n个精灵,两种精灵球各m1和m2个,每个精灵单独使用第一种精灵球有pi的概率被捕获,单独使用第二种精灵球有ui的概率被捕获,同时使用有1-(1-pi)*(1-ui)的概率被捕获.一种精灵球 ...

  7. 2019.03.09 codeforces833B. The Bakery(线段树优化dp)

    传送门 线段树优化dpdpdp入门题. 要求把nnn个数分成kkk段,每段价值为里面不相同的数的个数,求所有段的价值之和最大值.n≤35000,k≤50n\le35000,k\le50n≤35000, ...

  8. GCN代码分析 2019.03.12 22:34:54字数 560阅读 5714 本文主要对GCN源码进行分析。

    GCN代码分析   1 代码结构 . ├── data // 图数据 ├── inits // 初始化的一些公用函数 ├── layers // GCN层的定义 ├── metrics // 评测指标 ...

  9. 洛谷P4383 [八省联考2018]林克卡特树lct(DP凸优化/wqs二分)

    题目描述 小L 最近沉迷于塞尔达传说:荒野之息(The Legend of Zelda: Breath of The Wild)无法自拔,他尤其喜欢游戏中的迷你挑战. 游戏中有一个叫做“LCT” 的挑 ...

随机推荐

  1. cookie和session的区别及在Django中应用

    Django中Cookie和session应用 什么是cookie? cookie是客户端浏览器上的一个文件,以键值对进行保存,类似于字典的 {'key' : 'value'} ,与服务器端没有关系, ...

  2. wget -r -c -nd

    wget -r -c -nd -r 递归下载 -c 断点续传 -nd 不创建目录, wget默认会创建一个目录 -l1 (L one) 递归一层,只下载指定文件夹中的内容, 不下载下一级目录中的.–n ...

  3. MySQL相关sql语句

    登陆mysql: mysql -hlocalhost -uroot -proot 创建数据库:create database dbname charset utf8 查看数据库:show databa ...

  4. 初学python笔记----字符串

    ---恢复内容开始--- 1.在python中,用引号括起来的都是字符串,引号可以是单引号,也可以是双引号 2.修改字符串的大小写 3.字符串拼接用“+” 4.制表符("\t"), ...

  5. js判断访问浏览器是安卓还是ios还是微信浏览器还是微博

    var u = navigator.userAgent, app = navigator.appVersion; var isAndroid = u.indexOf('Android') > - ...

  6. iview table中使用Poptip

    h('Poptip', { props: { confirm: true, // 'ok-text':"yes", // 'cancel-text':"no", ...

  7. Mysql设置大小写敏感

    1.linux下mysql安装完后是默认:区分表名的大小写,不区分列名的大小写: 2.用root帐号登录后,在/etc/my.cnf 中的[mysqld]后添加添加lower_case_table_n ...

  8. Ubuntu16.04 修改主机名,以及解析主机名

    第一步:修改主机名: vim  /etc/hostname 第二步:修改网络解析名称: vim /etc/hosts 第三步:重启网络配置服务(或者刷新dns): sudo /etc/init.d/n ...

  9. 大数据实操3 - hadoop集群添加新节点

    hadoop集群支持动态扩展,不需要停止原有集群节点就可以实现新节点的加入. 我是使用docker搭建的进群环境,制作了镜像文件,这里以我的工作基础为例子介绍集群中添加集群的方法 一.制作一个新节点 ...

  10. 重启虚拟机后dhclient进程未运行解决办法

    问题分析 重启虚拟机后,dhclient进程未运行的根因通常为: 1.NetworkManager未开启自启动导致的dhclient进程未运行 2.网卡设置未纳入NetworkManager管理导致的 ...