[CSP-S模拟测试]:赤(red)(WQS二分+DP)
题目传送门(内部题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)的更多相关文章
- 「学习笔记」wqs二分/dp凸优化
[学习笔记]wqs二分/DP凸优化 从一个经典问题谈起: 有一个长度为 \(n\) 的序列 \(a\),要求找出恰好 \(k\) 个不相交的连续子序列,使得这 \(k\) 个序列的和最大 \(1 \l ...
- [CSP-S模拟测试]:中间值(二分)
题目背景 $Maxtir$喜欢序列的中间值. 题目传送门(内部题127) 输入格式 第一行输入两个正整数$n,m$,其中$m$是操作和询问次数. 接下来两行每行输入$n$个非负整数,每一行分别表示两个 ...
- [CSP-S模拟测试]:二叉搜索树(DP+贪心)
题目传送门(内部题99) 输入格式 第一行一个整数$n$,第二行$n$个整数$x_1\sim x_n$. 输出格式 一行一个整数表示答案. 样例 样例输入: 58 2 1 4 3 样例输出: 数据范围 ...
- [CSP-S模拟测试]:装饰(状压DP)
题目传送门(内部题114) 输入格式 第一行一个正整数$n$. 接下来一行$n-1$个正整数,第$i$个数为$f_{i+1}$. 接下来一行$n$个数,若第$i$个数为$0$则表示林先森希望$i$号点 ...
- [CSP-S模拟测试]:城市游戏(图论+DP)
题目传送门(内部题109) 输入格式 第一行,两个整数$n,m$. 接下来$m$行,每行三个整数$u,v,l$,描述了一条道路连接的两个路口的编号以及道路的长度. 输出格式 输出一行一个整数,为所求的 ...
- [CSP-S模拟测试]:取石子(博弈论+DP)
题目描述 有三堆石子,它们的石子个数分别为$x,y,z$.$A$和$B$正在博弈,由$A$先手,双方轮流操作.每次操作是指,选择若干堆($1-3$堆)石子,从中各取出相同数量的石子(不能$1$个都不取 ...
- [CSP-S模拟测试]:旅行计划(分块+DP)
题目传送门(内部题83) 输入格式 第一行两个整数$n,m$ 接下来$m$行,每行三个整数,$u,v,w$,表示从$u$到$v$有一条权值为$w$的边 接下来一行有一个整数$q$,表示$q$天 接下来 ...
- [CSP-S模拟测试]:糊涂图(概率DP)
题目传送门(内部题76) 输入格式 第一行输入三个空格隔开的整数$n,m,s$表示随机加一条边之前的糊涂图的点数,边数,以及起点的编号. 接下来$m$行,每行两个空格隔开的整数$a,b$表示从$a$到 ...
- [CSP-S模拟测试]:简单的期望(DP)
题目描述 从前有个变量$x$,它的初始值已给出. 你会依次执行$n$次操作,每次操作有$p\%$的概率令$x=x\times 2$,$(100−p)\%$的概率令$x=x+1$. 假设最后得到的值为$ ...
随机推荐
- delphi 加入超链接
delphi 加入超链接//在uses中加入ShellAPI//通过该lpFile参数可以实现链接到主页或ftp站点 ShellExecute(handle,nil,pchar('http://www ...
- Extjs的一些基础使用!
一.获取元素(Getting Elements) 1. Ext.get() var el = Ext.getCmp('id');//获取元素,等同于document.getElementById('i ...
- ALM11服务器IP变更相关配置修改
最近项目新增了网络控制,需要把ALM服务器迁移到新的区域.服务器整体复制后更改了IP地址. ALM与Oracle在同一台服务器(windows server 2008 R2) ALM的配置也需要做如下 ...
- 杂项:电子表格程序-u
ylbtech-杂项:电子表格程序-u 1.返回顶部 1.1 https://www.gemboxsoftware.com/spreadsheet 1.1 https://www.spreadshee ...
- Chrome-逆向分析JS-2获取发送请求位置(以datatables获取表格数据为例)
剧透:就是使用了一下 Chrome Source 的 XHR/fetch Breakpoints 功能,在发送请求时在该行进入断点调试. # 一:不认识一下 XHR/fetch Breakpoints ...
- Ubuntu安装 docker
安装docker首先要需要一台宿主机, 我目前用VMvare下安装的Ubuntu16.04系统为宿主机,进行docker安装测试. ubuntu安装时选的中文环境,生成的sources.list里面的 ...
- C#关于日期 月 天数 和一年有多少周及根据某年某周获取时间段的计算(转)
/// 当前月有多少天 /// </summary> /// <param name="y"></param> /// <param na ...
- 使用Excel绘制F分布概率密度函数图表
使用Excel绘制F分布概率密度函数图表 利用Excel绘制t分布的概率密度函数的相同方式,可以绘制F分布的概率密度函数图表. F分布的概率密度函数如下图所示: 其中:μ为分子自由度,ν为分母自由度 ...
- php_openssl.dll' - 找不到指定的模块。 in Unknown on line 0
今天在windows2003配置IIS+php_openssl,php-error.log老是提示“PHPWarning:PHPStartup:Unabletoloaddynamiclibrary'C ...
- Using-JSONNET-for-dynamic-JSON-parsing
原文 https://weblog.west-wind.com/posts/2012/Aug/30/Using-JSONNET-for-dynamic-JSON-parsing With the re ...