题目链接: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位,因此答案就是

\[\sum_{i=0}^{m}(max(dp[m][i][j])+i)*m轮之后第1位上的数是i的概率
\]

我们再记一个辅助数组\(f[i][j]\),表示在第\(i\)轮的时候,第1为上的数是\(j\)的概率

这个玩意比较好转移:

\[f[i][j]=(f[i-1][j-1]*s[i]+f[i-1][j]*(n-s[i]))/n
\]

特判一下\(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的更多相关文章

  1. TopCoder 649 div1 & div2

    最近一场TC,做得是在是烂,不过最后challenge阶段用一个随机数据cha了一个明显错误的代码,最后免于暴跌rating,还涨了一点.TC题目质量还是很高的,非常锻炼思维,拓展做题的视野,老老实实 ...

  2. TopCoder SRM500 Div1 250 其他

    原文链接https://www.cnblogs.com/zhouzhendong/p/SRM500-250.html SRM500 Div1 250 题意 (看题用了半个小时--) 有 n 个人(编号 ...

  3. TopCoder SRM500 Div1 500 分治

    原文链接https://www.cnblogs.com/zhouzhendong/p/SRM500-500.html SRM500 Div1 500 没想到 double 的精度居然没有爆-- 考虑以 ...

  4. TopCoder SRM500 Div1 1000 其他

    原文链接https://www.cnblogs.com/zhouzhendong/p/SRM500-1000.html SRM500 Div1 1000 设 \(v_1,v_2,\cdots ,v_9 ...

  5. TopCoder SRM502 Div1 500 贪心 01背包

    原文链接https://www.cnblogs.com/zhouzhendong/p/SRM502-500.html SRM502 Div1 500 好题. 首先,如果已经确定了解决所有问题的优先级, ...

  6. TopCoder SRM502 Div1 1000 动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/SRM502-1000.html SRM502 Div1 1000 题意 从 [0,n-1] 中选择 k 个不同的 ...

  7. topcoder SRM712 Div1 LR

    题目: Problem Statement      We have a cyclic array A of length n. For each valid i, element i-1 the l ...

  8. TopCoder 603 div1 & div2

    div2 250pts MiddleCode 题意:s串长度为奇数时,将中间字符取掉并添加到t末尾:长度为偶数时,将中间两个较小的字符取掉并添加到末尾. 分析:直接做,学习了一下substr(s, p ...

  9. TopCoder SRM704 Div1 800 构造

    原文链接https://www.cnblogs.com/zhouzhendong/p/SRM704-800.html 题解 考虑构造一个 $n = 20$ 的图. 先把所有 $i$ 都连向 $i-1$ ...

随机推荐

  1. 软件扒网站? 爬虫? F12查看源码? 查看网页源代码?浏览器sources? 区别和联系!

    1.软件扒网站: 利用各类扒站网站,如仿站小工具8.0,可以按照规则将网站的未经浏览器简析的前端代码扒下来,并整理成css,js,html等文件夹,很方便.(当然看不到ajax等相关代码) 备注:如果 ...

  2. 为什么HashMap初始大小为16,为什么加载因子大小为0.75,这两个值的选取有什么特点?

    先看HashMap的定义: public class HashMap<K,V>extends AbstractMap<K,V>implements Map<K,V> ...

  3. Volterra方程的不动点

  4. VS2015 + OPENCV + CUDA 安装流程

    VS2015  https://blog.csdn.net/guxiaonuan/article/details/73775519?locationNum=2&fps=1 OPENCV htt ...

  5. ssh登录

    ssh 用户名@IP地址 -p 端口号 ssh root@127.0.0.1 -p 2222

  6. Thread类相关方法

    线程对象 每一个线程都是和类Thread的实例相关联的.在Java中,有两种基本的使用Thread对象的方式,可用来创建并发性程序.  1.在应用程序需要发起异步任务的时候,只要生成一个Thread对 ...

  7. idea打包springboot+maven项目并发布在linux上

    2018年11月13日我亲测有效的,很简单的,借鉴博客:https://blog.csdn.net/smilecall/article/details/56288972 第一步:随便建一个maven类 ...

  8. C# Note31: 如何使用Visual Studio做单元测试

    待更! 使用Visual Studio 2013进行单元测试--初级篇 带你玩转Visual Studio——单元测试(C++例)

  9. 关于Vue-cli 组件引入CSS样式文件

    在 Vue-cli 组件 .vue 文件中引入 css 样式表出错   由于使用Vue-cli后, 引入css 样式表 不需要 多余../../ 之类路径  现在写法也发生了改变 <style ...

  10. python中的 list (列表)append()方法 与extend()方法的用法 和 区别

    参考: https://www.cnblogs.com/xuchunlin/p/5479119.html