题目传送门(内部题38)


输入格式

每个输入文件包含多组测试数据。选手应当处理到文件结束($EOF$)
每一组数据包括$3$行。
第$1$行包含三个正整数$n,a,b$,表示有$n$只猫,$gyz$有$a$包干脆面和$b$包豆干。
第$2$行包含$n$个保留小数点后$3$位的实数$p_1,p_2...p_n$,$p_i$表示第$i$只猫喜欢干脆面的概率。
第$3$行包含$n$个保留小数点后$3$位的实数$q_1,q_2...q_n$,$q_i$表示第$i$只猫喜欢豆干的概率。


输出格式

每组测试数据输出一行,表示最优策略下期望捉到的猫数。保留小数点后$3$位输出。


样例

样例输入:

3 2 2
1.000 0.000 0.500
0.000 1.000 0.500
4 1 3
0.100 0.500 0.500 0.600
0.100 0.500 0.900 0.400
3 2 0
0.412 0.198 0.599
0.612 0.987 0.443

样例输出:

2.75000
2.16000
1.01100


数据范围与提示

$T$表示测试数据组数,$\sum n$表示输入文件中所有数据的$n$之和。
$100\%$的数据,$T\leqslant 10,\sum n$不超过$100,000$。
$100\%$的数据,$0\leqslant a\leqslant n,0\leqslant b\leqslant n$。
每个测试点的$n,T$的范围见下表。


题解

原题是$codeforces 794E$,这道题增加了数据范围i提高了难度(原题官方题解$\Theta(n^2\log n)$时间复杂度).

为了方便,以下干脆面简称辣条……

对于这道题,我们期望抓到猫的个数即为猫喜欢的概率。

那么对于一只猫,分为四种情况:

  $\alpha.$不投喂,贡献为$0$。

  $\beta.$投喂辣条,贡献为$p_i$。

  $\gamma.$投喂豆干,贡献为$q_i$。

  $\delta.$都投喂,贡献为$p_i+q_i-p_i\times q_i$(注意可以理解为减去了都喜欢的概率)。

先来考虑$\Theta(n\times a\times b)$的$DP$。

定义$dp[i][j][k]$表示到了第$i$只猫,用了$j$个辣条,$k$个豆干的最大值。

那么状态转移方程即为:
$dp[i][j][k]=\max(dp[i-1][j][k],dp[i-1][j-1][k-1]+p_i+q_i-p_i\times q_i,dp[i-1][j-1][k]+p_i,dp[i-1][j][k-1]q_i)$

需要注意的是空间问题,小心不要$MLE$,不然你就$TM$双$LE$了。

不知道有没有人还记得这道题[BZOJ2654]:tree(Kruskal+WQS二分),当然我说的是正解,也就是$WQS$(忘情水)二分。

那么这道题我们也可以这样考虑,先将所有的辣条都加一个额外的代价,然后用花费的辣条跟总辣条数做比较;豆干同理。

时间复杂度:$\Theta(n\log^2n)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
int n,a,b;
double p[100001],q[100001];
double dp[100001],fp[100001],fq[100001];
void calc(double x,double y)
{
for(int i=1;i<=n;i++)
{
dp[i]=dp[i-1];
fp[i]=fp[i-1];
fq[i]=fq[i-1];
if(dp[i-1]+p[i]>dp[i]+x)
{
dp[i]=dp[i-1]+p[i]-x;
fp[i]=fp[i-1]+1;
fq[i]=fq[i-1];
}
if(dp[i-1]+q[i]>dp[i]+y)
{
dp[i]=dp[i-1]+q[i]-y;
fp[i]=fp[i-1];
fq[i]=fq[i-1]+1;
}
if(dp[i-1]+p[i]+q[i]-p[i]*q[i]>dp[i]+x+y)
{
dp[i]=dp[i-1]+p[i]+q[i]-p[i]*q[i]-x-y;
fp[i]=fp[i-1]+1;
fq[i]=fq[i-1]+1;
}
}
}
double dichotomize2(double mid1)
{
double lft=0,rht=1;
while(rht-lft>1e-8)
{
double mid2=(lft+rht)/2;
calc(mid1,mid2);
if(fq[n]>b)lft=mid2;
else rht=mid2;
}
return rht;
}
pair<double,double> dichotomize1()
{
double lft=0,rht=1;
while(rht-lft>1e-8)
{
double mid=(lft+rht)/2;
calc(mid,dichotomize2(mid));
if(fp[n]>a)lft=mid;
else rht=mid;
}
double flag=dichotomize2(rht);
calc(rht,flag);
return make_pair(rht,flag);
}
int main()
{
while(~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",&q[i]);
pair<double,double> flag=dichotomize1();
printf("%.3lf\n",dp[n]+a*flag.first+b*flag.second);
}
return 0;
}

rp++

[CSP-S模拟测试]:赤(red)(WQS二分+DP)的更多相关文章

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

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

  2. [CSP-S模拟测试]:中间值(二分)

    题目背景 $Maxtir$喜欢序列的中间值. 题目传送门(内部题127) 输入格式 第一行输入两个正整数$n,m$,其中$m$是操作和询问次数. 接下来两行每行输入$n$个非负整数,每一行分别表示两个 ...

  3. [CSP-S模拟测试]:二叉搜索树(DP+贪心)

    题目传送门(内部题99) 输入格式 第一行一个整数$n$,第二行$n$个整数$x_1\sim x_n$. 输出格式 一行一个整数表示答案. 样例 样例输入: 58 2 1 4 3 样例输出: 数据范围 ...

  4. [CSP-S模拟测试]:装饰(状压DP)

    题目传送门(内部题114) 输入格式 第一行一个正整数$n$. 接下来一行$n-1$个正整数,第$i$个数为$f_{i+1}$. 接下来一行$n$个数,若第$i$个数为$0$则表示林先森希望$i$号点 ...

  5. [CSP-S模拟测试]:城市游戏(图论+DP)

    题目传送门(内部题109) 输入格式 第一行,两个整数$n,m$. 接下来$m$行,每行三个整数$u,v,l$,描述了一条道路连接的两个路口的编号以及道路的长度. 输出格式 输出一行一个整数,为所求的 ...

  6. [CSP-S模拟测试]:取石子(博弈论+DP)

    题目描述 有三堆石子,它们的石子个数分别为$x,y,z$.$A$和$B$正在博弈,由$A$先手,双方轮流操作.每次操作是指,选择若干堆($1-3$堆)石子,从中各取出相同数量的石子(不能$1$个都不取 ...

  7. [CSP-S模拟测试]:旅行计划(分块+DP)

    题目传送门(内部题83) 输入格式 第一行两个整数$n,m$ 接下来$m$行,每行三个整数,$u,v,w$,表示从$u$到$v$有一条权值为$w$的边 接下来一行有一个整数$q$,表示$q$天 接下来 ...

  8. [CSP-S模拟测试]:糊涂图(概率DP)

    题目传送门(内部题76) 输入格式 第一行输入三个空格隔开的整数$n,m,s$表示随机加一条边之前的糊涂图的点数,边数,以及起点的编号. 接下来$m$行,每行两个空格隔开的整数$a,b$表示从$a$到 ...

  9. [CSP-S模拟测试]:简单的期望(DP)

    题目描述 从前有个变量$x$,它的初始值已给出. 你会依次执行$n$次操作,每次操作有$p\%$的概率令$x=x\times 2$,$(100−p)\%$的概率令$x=x+1$. 假设最后得到的值为$ ...

随机推荐

  1. 如何稀释 流事件 (如,onscroll、change、input、mouseover 等 事件)

    1.问题引入:https://segmentfault.com/q/1010000000707337?_ea=62905 2.javascript中的函数节流和函数去抖:https://www.cnb ...

  2. 北风设计模式课程---UML类图各符号含义

    北风设计模式课程---UML类图各符号含义 一.总结 一句话总结: 用脑子,挺好记的:实线关系肯定比虚线重,箭头.三角形.菱形的关系肯定依次加重,三角形是继承和实现, 1.UML类图中 线+箭头 表示 ...

  3. php与js互相调用

    php中调用js <?php echo '<script>var yearid=$("#yearId").val()</script>'; echo ...

  4. git 忽略提交及已push过得文件忽略提交

    在使用Git的过程中,我们喜欢有的文件比如日志,临时文件,编译的中间文件等不要提交到代码仓库,这时就要设置相应的忽略规则,来忽略这些文件的提交 Git 忽略文件提交的方法 这种方式通过在项目的某个文件 ...

  5. CF560补题

    D题:用来对比的vector<long long> b不能被初始化大小成n,因为a里面有n个因子,但是这是可能存在遗漏情况的.如果刚好是遇到实际因子远多于n,那么就会在运行过程中出错. 还 ...

  6. loadrunner 快捷键

    lr 不同的界面切换 crt f6lr:选中要查找的内容 ctrl +f3 超找文本 选中所有字母大写 ctl +shift+ u;小写

  7. C++ 中的 const、引用和指针的深入分析

    1,关于 const 的疑问: 1,const 什么时候为只读变量,什么时候是常量: 1,const 从 C 到 C++ 进化的过程中得到了升级,const 在 C++ 中不仅仅像在 C 中声明一个只 ...

  8. vue - blog开发学习5

    基本功能和后台联调 1.首页的所有博客 因为是前后台都是本地开发,所以前端vue需要设置proxy:修改/config/index.js中的这个proxyTable proxyTable: { '/a ...

  9. 了解JSON Web令牌(JWT)

    JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案.今天给大家介绍JWT的原理和用法. 1.跨域身份验证 Internet服务无法与用户身份验证分开.一般过程如下. 1.用户向服 ...

  10. 在线px转换rem工具

    今天推荐一个在线工具,在线px转换rem工具 只要输入1rem = 多少px即可在线转换 和cssrem插件差不多的功能   rem在线转换工具: http://www.ofmonkey.com/fr ...