题目传送门(内部题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. 10.27 sort

    排序命令sort选项与参数:-f :忽略大小写的差异,例如 A 与 a 视为编码相同:-b :忽略最前面的空白字符部分:-M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法:-n :使用 ...

  2. 关于exe文件传递参数方法

    段代码手工折叠 {$REGION 'Designer Managed Code'} ............ {$ENDREGION} 昨天同事问到,delphi里exe文件如何传递参数? 因为手头装 ...

  3. scrapy工作流程

    整个scrapy流程,我们可以用去超市取货的过程来比喻一下 两个采购员小王和小李开着采购车,来到一个大型商场采购公司月饼.到了商场之后,小李(spider)来到商场前台,找到服务台小花(引擎)并对她说 ...

  4. 【原】webpack--文件监听的原理

    轮询判断文件的最后编辑时间是否发生变化,一开始有个文件的修改时间,先存储起来这个修改时间,下次再有修改就会和上次修改时间比对,发现不一致的时候不会立即告诉监听者,而是把文件修改缓存起来,等待一段时间, ...

  5. C#-Newtonsoft.Json遍历并修改JSON

    遍历 JObject:https://www.newtonsoft.com/json/help/html/JObjectProperties.htm 遍历 JArray: string json = ...

  6. js获取近十二个月

    1.获取近十二个月 var dataArr = []; var data = new Date(); var year = data.getFullYear(); data.setMonth(data ...

  7. python 装饰器 第八步:使用类来作为装饰器参数

    #第八步:使用类作为装饰器参数 #装饰器使用的操作类 class Wish: #祈求方法 def before(): print('饭前洗洗手') #还愿方法 def after(): print(' ...

  8. QT pro文件的一种通用配置

    #设置UI文件目录 UI_DIR = ./ui CONFIG(debug, debug|release) {   #设置debug配置下编译生成文件的路径 TARGET = $$join(TARGET ...

  9. Cocos2d-x之Log输出机制

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. 在cocos2d-x中,我们使用log这个函数进行输出,log可以输出很多参数,它的使用方式就和使用c语言中的printf的使用方式差不多 ...

  10. 下载Excel文件功能通过火狐浏览器下载没有后缀名

    最近遇到一个问题,用导出Excelwe文件使用Chrome浏览器是没有问题的,但是用火狐浏览器会出现下载的Excel文件没有后缀名.检查了很多东西都没找到原因.最后和之前的下载功能做对比发现,Exce ...