topcoder SRM642 div1 hard WheelofFortune
题目链接:vjudge
大意:有两个人参加一场游戏,这个游戏在一个编号为\(0\text~n-1\)的轮盘上进行,一开始轮盘上的数字均为0;一共有\(m\)轮,每一轮都有一个操作参数\(s_i\),主持人等概率置顶某个位置\(j\),从\(j\)开始数\(s_i\)个位置,每个位置上的数+1(这两个人均不知道主持人所选定的位置)。\(m\)轮结束之后,Alice指定一个位置,主持人告知该位上的数。Bob根据Alice得到的回答再选定一个位置(可以重复),获得该位置上的数。他们的游戏得分就是所获得的两数之和。求其期望(好长啊qwq)
分析
被800搞自闭了
我们将格子编号+1,方便叙述
记\(dp[i][j][k]\)为在进行到第\(i\)轮的时候,第1位上的数字为\(j\)时,第\(k\)位上数字的期望
因为我们总可以将Alice所选的位置看作是第1位,因此答案就是
\]
我们再记一个辅助数组\(f[i][j]\),表示在第\(i\)轮的时候,第1为上的数是\(j\)的概率
这个玩意比较好转移:
\]
特判一下\(j=0\)时只有一种转移
那么我们接着处理\(dp\)数组的转移,容易知道\(dp[i][j][k]\)也会是由\(dp[i-1][j-1][k]\)和\(dp[i-1][j][k]\)转移而来
具体的实现的话我们需要第二个辅助数组\(tim[i][j]\)表示当所选取的+1区间长度为\(i\),且保证区间包含第1位时,包含第\(j\)位的情况数,这个可以暴力枚举求解
然后转移就变得比较清晰了:根据转移而来的状态是否包含了第1位来求解
具体转移详见程序
注意arena上交题的时候稍微大一点的数组要开在外面。。。
#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<vector>
#include<queue>
#include<map>
using namespace std;
const int maxd=1000000007,N=100000;
const double pi=acos(-1.0),eps=1e-8;
typedef long long ll;
double f[350][350],dp[350][350][350];
int tim[350][350],m;
struct WheelofFortune{
double maxExpectedValue(int n,vector<int> s)
{
int i,j,k;m=s.size();
memset(dp,0,sizeof(dp));
memset(f,0,sizeof(f));
memset(tim,0,sizeof(tim));
for (i=1;i<=n;i++)
{
for (j=1;j<=i;j++)
{
for (k=0;k<i;k++)
{
tim[i][(j-k+n-1)%n+1]++;
}
}
}
f[0][0]=1;
for (i=1;i<=m;i++)
{
for (j=0;j<=i;j++)
{
f[i][j]=f[i-1][j]*(n-s[i-1])/n;
if (j) f[i][j]+=f[i-1][j-1]*s[i-1]/n;
if (f[i][j]<eps) continue;
for (k=1;k<=n;k++)
{
dp[i][j][k]+=(dp[i-1][j][k]*(n-s[i-1])+(s[i-1]-tim[s[i-1]][k]))/n*f[i-1][j]/f[i][j];
if (j) dp[i][j][k]+=(dp[i-1][j-1][k]*s[i-1]+tim[s[i-1]][k])/n*f[i-1][j-1]/f[i][j];
}
}
}
double ans=0.0;
for (i=0;i<=m;i++)
{
double maxnum=0.0;
for (j=2;j<=n;j++) maxnum=max(maxnum,dp[m][i][j]);
ans+=f[m][i]*(i+maxnum);
}
return ans;
}
}a;
topcoder SRM642 div1 hard WheelofFortune的更多相关文章
- TopCoder 649 div1 & div2
最近一场TC,做得是在是烂,不过最后challenge阶段用一个随机数据cha了一个明显错误的代码,最后免于暴跌rating,还涨了一点.TC题目质量还是很高的,非常锻炼思维,拓展做题的视野,老老实实 ...
- TopCoder SRM500 Div1 250 其他
原文链接https://www.cnblogs.com/zhouzhendong/p/SRM500-250.html SRM500 Div1 250 题意 (看题用了半个小时--) 有 n 个人(编号 ...
- TopCoder SRM500 Div1 500 分治
原文链接https://www.cnblogs.com/zhouzhendong/p/SRM500-500.html SRM500 Div1 500 没想到 double 的精度居然没有爆-- 考虑以 ...
- TopCoder SRM500 Div1 1000 其他
原文链接https://www.cnblogs.com/zhouzhendong/p/SRM500-1000.html SRM500 Div1 1000 设 \(v_1,v_2,\cdots ,v_9 ...
- TopCoder SRM502 Div1 500 贪心 01背包
原文链接https://www.cnblogs.com/zhouzhendong/p/SRM502-500.html SRM502 Div1 500 好题. 首先,如果已经确定了解决所有问题的优先级, ...
- TopCoder SRM502 Div1 1000 动态规划
原文链接https://www.cnblogs.com/zhouzhendong/p/SRM502-1000.html SRM502 Div1 1000 题意 从 [0,n-1] 中选择 k 个不同的 ...
- topcoder SRM712 Div1 LR
题目: Problem Statement We have a cyclic array A of length n. For each valid i, element i-1 the l ...
- TopCoder 603 div1 & div2
div2 250pts MiddleCode 题意:s串长度为奇数时,将中间字符取掉并添加到t末尾:长度为偶数时,将中间两个较小的字符取掉并添加到末尾. 分析:直接做,学习了一下substr(s, p ...
- TopCoder SRM704 Div1 800 构造
原文链接https://www.cnblogs.com/zhouzhendong/p/SRM704-800.html 题解 考虑构造一个 $n = 20$ 的图. 先把所有 $i$ 都连向 $i-1$ ...
随机推荐
- 面试题-如何测试一个APP
问: 假如给你一个APP,你应该如何测试,分别从哪些方面来针对该APP进行测试. --- 1.安装.卸载测试 测试软件在不同操作系统(Android.iOS)下安装是否正常.软件安装后的是否能够正常运 ...
- 助教总结 -【福大软工实践-2017-2018-K班】
助教总结 -[福大软工实践-2017-2018-K班] 非常抱歉这么晚才来写总结! 助教工作 助教共发表博客39篇. 助教共点评约500条. 起步 对于常规课程的起步,通常都是在第一次课堂上由老师对课 ...
- Python的math模块
ceil(x) 返回整数 >>> math.ceil(-1.273) -1 >>> math.ceil(1.33) 2 copysign(x,y) 把y的符号给x, ...
- 记第一次多用户在Git提交代码
今天第一次进行了多用户(其实就两人)在自建Git服务器提交代码. 先记录碰到的问题:首先是本地提交代码时,进行了add,commit后,在push时碰到服务器故障,待设置好服务器后,再push时,却p ...
- scrapy之持久化存储
scrapy之持久化存储 scrapy持久化存储一般有三种,分别是基于终端指令保存到磁盘本地,存储到MySQL,以及存储到Redis. 基于终端指令的持久化存储 scrapy crawl xxoo - ...
- 【学习总结】vi/vim命令是使用
每次要么想不起来用,要么进去了出不来,真是醉了.痛定思痛此处填坑. 参考教程:菜鸟教程vi/vim 实验环境:借Git-bash宝地一用 注意:记住关键的步骤! 按i a o进入输入模式(即使有时按v ...
- ORACLE 当字段中有数据如何修改字段类型
创建视图的时候,因为表太多,里面一些字段类型不一样,PL/SQL报错,为‘表达式必须具有对应表达式相同的数据类型’,发现后,一个字段的类型为CLOB和VARCHAR2(4000)两种,将CLOB进行修 ...
- js判断数组是否包含某个字符串变量的实例
最近碰到一个这样的现象,后台返回的数据中,数组里面有一些有变量值,有一些没有变量值. 举个例子,比如后台返回的例子是这样的: var arr=[ { "status":" ...
- js实现input的赋值
input框赋值如下所示,是一个文本框的html代码,实际开发中,要涉及到将数据库中的数据取出然后放入input框中. <input id="name1" name=&quo ...
- Flutter上拉加载下拉刷新---flutter_easyrefresh
前言 Flutter默认不支持上拉加载,下拉刷新也仅仅支持Material的一种样式.Android开发使用过SmartRefreshLayout的小伙伴都知道这是一个强大的刷新UI库,集成了很多出色 ...