题目链接

第一种解法是$O(n^3*p)$的:
f[i][j][k]表示前i个人进j个人长度为k有几种方案(排列固定为123..n时)。
$f[i][j][k]=f[i-1][j][k]+f[i-1][j-1][k-a[i]]$
最外层枚举t表示被卡的那个人。i=t时不加上f[i-1][j-1][k-a[i]]。
$ans={{(\sum f[n][j][k]*j*j!*(n-1-j)!)+(\sum f[n][n][k]*n)}}/(n!)$。

可以看看这篇题解

#include<cstdio>
#include<cstring>
#define N 55
int n,p,a[N];
double f[N][N][N],ans,c[N]= {1};
int main(){
scanf("%d",&n);
for(int i=1; i<=n; i++){
scanf("%d",&a[i]);
c[i]=c[i-1]*i;
}
scanf("%d",&p);
for(int t=0; t<=n; t++){
memset(f,0,sizeof f);
f[0][0][0]=1;
for(int i=1; i<=n; i++)
for(int j=0; j<=i; j++)
for(int k=0; k<=p; k++){
f[i][j][k]=f[i-1][j][k];
if(j>=1&&t!=i&&k>=a[i])f[i][j][k]+=f[i-1][j-1][k-a[i]];
}
for(int j=1; j<n; j++)
for(int k=1; k<=p; k++)if(a[t]+k>p)
ans+=c[j]*c[n-1-j]/c[n]*f[n][j][k]*j;
for(int k=1; k<=p; k++)ans+=f[n][n][k]*n;
}
printf("%lf",ans);
}

还可以更高效,$O(n^2*p)$
参考题解

f[i][j][k]表示前i个人至少进j个人这j个人的长度和为k有几种方案(排列为123..n时)。
那么$ans=(\sum f[n][j][k]*j!*(n-j)!/(n!)$。

我原来不太理解为什么至少j个人就是这么推,问了下队友,说是因为没有卡后面的,所以有可能可以进更多人。
其实第一种方法算的f也是至少j个人,然后在后面累加ans时再卡住第j+1个人。

并且可以用滚动数组优化为2维数组。

#include<cstdio>
#define N 51
int n,a[N],p;
double fac[N]= {1},f[N][N],tol,ans;
int main()
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%d",a+i);
fac[i]=fac[i-1]*i;
tol+=a[i];
}
scanf("%d",&p);
if(tol<=p)
{
printf("%d",n);
return 0;
}
f[0][0]=1;
for(int i=1; i<=n; i++)
for(int j=n-1; j>=0; j--)
for(int k=0; k+a[i]<=p; k++)
f[j+1][k+a[i]]+=f[j][k];
for(int j=1; j<=n; j++)
for(int k=0; k<=p; k++)
ans+=f[j][k]*fac[j]*fac[n-j];
ans/=fac[n];
printf("%lf",ans);
}
  

【CodeForces 261B】Maxim and Restaurant(DP,期望)的更多相关文章

  1. codeforces 261B Maxim and Restaurant(概率DP)

    B. Maxim and Restaurant time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  2. CodeForces - 261B Maxim and Restaurant

    http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...

  3. CodeForces 261B Maxim and Restaurant 解法汇总

    题意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a3-+ai,问满足Si<=p的i的最大值的期望.(p<=50) 这道题在网上有一些不同 ...

  4. Codeforces Round #160 (Div. 2) D. Maxim and Restaurant(DP)

    题目链接 想了挺久,枚举每一件物品,当做关键物品,假设再加这一件物品,就>=c了,把剩下的物品背一下包,dp[i][j]表示i个物品可以组成重量j的个数. 这样就可以知道前面放i件,后边肯定放n ...

  5. Codeforces 123E Maze(树形DP+期望)

    [题目链接] http://codeforces.com/problemset/problem/123/E [题目大意] 给出一棵,给出从每个点出发的概率和以每个点为终点的概率,求出每次按照dfs序从 ...

  6. cf 261B.Maxim and Restaurant

    什么什么期望的,不会! (题解http://blog.sina.com.cn/s/blog_140e100580102wj4e.html(看不懂)) #include<bits/stdc++.h ...

  7. [CF697D]Puzzles 树形dp/期望dp

    Problem Puzzles 题目大意 给一棵树,dfs时随机等概率选择走子树,求期望时间戳. Solution 一个非常简单的树形dp?期望dp.推导出来转移式就非常简单了. 在经过分析以后,我们 ...

  8. Problem Arrangement ZOJ - 3777(状压dp + 期望)

    ZOJ - 3777 就是一个入门状压dp期望 dp[i][j] 当前状态为i,分数为j时的情况数然后看代码 有注释 #include <iostream> #include <cs ...

  9. CodeForces - 28C Bath Queue 概率与期望

    我概率期望真是垃圾--,这题搞了两个钟头-- 题意 有\(n\)个人,\(m\)个浴室,每个浴室里有\(a_i\)个浴缸.每个人会等概率随机选择一个浴室,然后每个浴室中尽量平分到每个浴缸.问期望最长排 ...

  10. [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆)

    [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆) 题面 一棵二叉树的所有点的点权都是给定的集合中的一个数. 让你求出1到m中所有权 ...

随机推荐

  1. luogu[1279]字串距离

    题目描述 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为”abcbcd”,则字符串“abcb□cd”,“□a□bcbcd□”和“abcb□cd□”都是X ...

  2. nginx缓存配置的操作记录梳理

    web缓存位于内容源Web服务器和客户端之间,当用户访问一个URL时,Web缓存服务器会去后端Web源服务器取回要输出的内容,然后,当下一个请求到来时,如果访问的是相同的URL,Web缓存服务器直接输 ...

  3. [py]文件 字符串 列表特例

    文件 readlines 列表 readline 字符串 read 字符串   列表---拆分---小列表   f=file('test.log','r') for line in f.readlin ...

  4. DWZ-JUI 树形Checkbox组件 无法一次获取所有选中的值的解决方法

    UI中 tree Checkbox 组件 在官方文档中提供的oncheck事件中只能够获取当前点击的权限值,而无法获取其他选中的值 <ul class="tree treeFolder ...

  5. ORA-28000: the account is locked-的解决办法

    ORA-28000: the account is locked第一步:使用PL/SQL,登录名为system,数据库名称不变,选择类型的时候把Normal修改为Sysdba;第二步:选择myjob, ...

  6. Method not found: '!!0[] System.Array.Empty()'.

    错误原因:程序里面没有可调用的方法(程序使用的是 .NET Framework 4.6,但是你自己的系统里面使用的不是 4.6版本) 解决方法:1.安装window sp1  ,下载地址是:https ...

  7. who命令的总结

    who命令能做什么 who命令用来查看谁登录了系统(show who is logged on ): 每一行代表一个巳经登录的用户,第1列是用户名,第2列是终端名,第3列是登录时间. 通过whatis ...

  8. Qt中的qreal

    在桌面操作系统中(比如Windows, XNix等)qreal其实就是double类型:而在嵌入设备系统中,qreal则等同于float 类型.

  9. Tomcat 启动提示未发现 APR 的解决方法

    Tomcat 启动出现信息如下: 信息: The APR based Apache Tomcat Native library which allows optimal performance in ...

  10. SQL基础之GROUPING

    1.grouping sets 记得前几天第一次接触grouping sets时,笔者的感觉是一脸懵逼. 后来一不小心看到msdn上对grouping sets的说明,顿时豁然开朗,其实groupin ...