Codeforces 749E Gosha is hunting 二分+DP
很神奇的一题 看完题解不由惊叹
题意:\(n\)个神奇宝贝 \(a\)个普通球 \(b\)个高级球 普通球抓住\(i\)神奇宝贝的概率为\(u[i]\) 高级球为\(p[i]\) 一起用为\(u[i]+p[i]-u[i]*p[i]\) 求期望抓到个神奇宝贝个数
\(N,a,b\leq2000\)
首先不难想到\(O(n^3)\)的暴力\(DP\) 听说CF的机子可过 我们接下来写如何优化
对于一个凸函数\(f(x)\) 我们假设可以通过某种特殊方式获得其的极值和极值点
令\(F(x)=f(x)-kx\) 不难发现\(F(x)\)也是一个凸函数 仍然假设可以获得其极值和极值点 那么求导可以看出 当\(k\)减小时 极值点会右移
对于本题 暴力的\(dp\) 为\(f[i][j][k]\) 表示到第\(i\)个神奇宝贝用了\(j\)个普通球 \(k\)个高级球的最大期望
我们可以发现如果将\(f[i][j](x)\)看做之前提到的\(f(x)\) 那么我们可以通过二分\(k\)值并不断更新 使得\(F(x)\) 的极值点为\(b\) 此时的\(ans=F[n][a]_{max}+b*k\) 即为最大值
对于一次求\(F(x)=f[n][a]-kx\)的时间复杂度为\(O(n^2)\)
#include<bits/stdc++.h>
using namespace std;
#define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
#define pa pair<int,int>
#define mod 1000000007
#define ll long long
#define mk make_pair
#define pb push_back
#define fi first
#define se second
#define cl(x) memset(x,0,sizeof x)
#ifdef Devil_Gary
#define bug(x) cout<<(#x)<<" "<<(x)<<endl
#define debug(...) fprintf(stderr, __VA_ARGS__)
#else
#define bug(x)
#define debug(...)
#endif
#define eps 1e-10
const int INF = 0x3fff;
const int N=2e3+5;
/*
char *TT,*mo,but[(1<<15)+2];
#define getchar() ((TT==mo&&(mo=(TT=but)+fread(but,1,1<<15,stdin),TT==mo))?-1:*TT++)//*/
inline int read(){
int x=0,rev=0,ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')rev=1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return rev?-x:x;
}
double f[N][N],u[N],p[N];
int n,a,b,g[N][N];
void update(double&a,int&b,double c,int d){
if(a+eps<c) a=c,b=d;
}
int calc(double k){
for(int i=1;i<=n;i++)
for(int j=0;j<=a;j++){
f[i][j]=g[i][j]=0;
update(f[i][j],g[i][j],f[i-1][j],g[i-1][j]);
update(f[i][j],g[i][j],f[i-1][j]+u[i]-k,g[i-1][j]+1);
if(!j)continue;
update(f[i][j],g[i][j],f[i-1][j-1]+p[i],g[i-1][j-1]);
update(f[i][j],g[i][j],f[i-1][j-1]+1-(1-p[i])*(1-u[i])-k,g[i-1][j-1]+1);
}
return g[n][a];
}
int main(){
#ifdef Devil_Gary
freopen("in.txt","r",stdin);
#endif
cin>>n>>a>>b;
for(int i=1;i<=n;i++) cin>>p[i];
for(int i=1;i<=n;i++) cin>>u[i];
double l=-INF,r=INF;
for(int T=1;T<=100;T++){
double mid=(l+r)/2;
if(calc(mid)<=b) r=mid;
else l=mid;
}
return printf("%.8f\n",f[n][a]+b*l),0;
}
Codeforces 749E Gosha is hunting 二分+DP的更多相关文章
- Codeforces.739E.Gosha is hunting(DP 带权二分)
题目链接 \(Description\) 有\(n\)只精灵,两种精灵球(高级和低级),每种球能捕捉到第\(i\)只精灵的概率已知.求用\(A\)个低级球和\(B\)个高级球能捕捉到精灵数的最大期望. ...
- codeforces 487B B. Strip(RMQ+二分+dp)
题目链接: B. Strip time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- codeforces 739E - Gosha is hunting
这道题有三种做法,感受一下: 感觉到了歪果仁费尽脑汁想出来的神仙贪心脑洞题被中国人套路算法踩爆的凄凉...(我的名字是不是暴露了我的真实实力) ============================ ...
- 2019.03.12 codeforces739E. Gosha is hunting(dp凸优化)
传送门 题意:nnn个物品,有aaa个XXX道具和bbb个YYY道具,XXX道具移走第iii个物品概率为pip_ipi,YYY道具移走第iii个道具概率为uiu_iui. 对于每个物品每种道具最多 ...
- [Codeforces 865C]Gotta Go Fast(期望dp+二分答案)
[Codeforces 865C]Gotta Go Fast(期望dp+二分答案) 题面 一个游戏一共有n个关卡,对于第i关,用a[i]时间通过的概率为p[i],用b[i]通过的时间为1-p[i],每 ...
- Codeforces 865C Gotta Go Fast 二分 + 期望dp (看题解)
第一次看到这种骚东西, 期望还能二分的啊??? 因为存在重置的操作, 所以我们再dp的过程中有环存在. 为了消除环的影响, 我们二分dp[ 0 ][ 0 ]的值, 与通过dp得出的dp[ 0 ][ 0 ...
- 【CF739E】Gosha is hunting(动态规划,凸优化)
[CF739E]Gosha is hunting(动态规划,凸优化) 题面 洛谷 CF 题解 一个\(O(n^3)\)的\(dp\)很容易写出来. 我们设\(f[i][a][b]\)表示前\(i\)个 ...
- 「学习笔记」wqs二分/dp凸优化
[学习笔记]wqs二分/DP凸优化 从一个经典问题谈起: 有一个长度为 \(n\) 的序列 \(a\),要求找出恰好 \(k\) 个不相交的连续子序列,使得这 \(k\) 个序列的和最大 \(1 \l ...
- 【codeforces 749E】 Inversions After Shuffle
http://codeforces.com/problemset/problem/749/E (题目链接) 题意 给出一个1~n的排列,从中等概率的选取一个连续段,设其长度为l.对连续段重新进行等概率 ...
随机推荐
- Spring Cloud(十二)声名式服务调用:Feign 的使用(下)
前言 本文是对上一篇博文的扩充,很多平时用不到的特性就开始简略一写,Spring Cloud各版本之间的差距很大的,用不到的可能下一个版本就被kill掉了.由于笔者写本文开始的时候误解了Feign的继 ...
- javascript模块模式
目前模块模式得到了广泛应用,因为它提供了结构化的思想并且有助于组织日益增长的代码.模块模式提供了一种创建自包含非耦合代码片段有利工具,可以将它视为黑盒功能. 板栗: var array = (func ...
- 配置SpringMvc + maven 数据源!(四)
添加依赖项 1. 添加 mybatis 库,打开 pom.xml 添加 mybatis dependency 依赖; <dependency> <groupId>org.myb ...
- HDU 3787 A+B 模拟题
解题报告:就是输入两个用逗号隔开的数字,求出这两个数字的和,并且用正常的方式输出来.直接写一个函数将一个包含逗号的数字转换成十进制的数返回就行了.这里推荐一个函数atoi(),参数是char*型的,然 ...
- centos7.2 安装 composer
安装Composer https://pkg.phpcomposer.com/#how-to-install-composer # 下载composer.phar curl -sS https:// ...
- BAT修改文本内容
@echo off (for /f "delims=" %%a in (文件名) do ( set "str=%%a" setlocal enabledelay ...
- zabbix 3.2.2 server端(源码包)安装部署 (一)【转】
环境准备: 操作系统 CentOS 6.8 2.6.32-642.11.1.el6.x86_64 zabbix server 172.16.10.150 zabbix agent 172.16.10. ...
- Project Euler Problem5
Smallest multiple Problem 5 2520 is the smallest number that can be divided by each of the numbers f ...
- linux使用badblocks命令扫描硬盘排除故障(待验证)
检查硬盘是否产生坏道并输出# badblocks -s -v -o /root/badblocks.log /dev/sda //公司操作 -s Show the p ...
- 不将EF连接字符串写在配置文件的方法
edmx的构造函数: public DecorationMSEntities() : base(myConfig.DataBaseConnectionString, "DecorationM ...