codeforces 261B Maxim and Restaurant(概率DP)

B. Maxim and Restaurant

time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

Maxim has opened his own restaurant! The restaurant has got a huge table, the table‘s length is p meters.

Maxim has got a dinner party tonight, n guests will come to him. Let‘s index the guests of Maxim‘s restaurant from 1 to n. Maxim knows the sizes of all guests that are going to come to him. The i-th guest‘s size (ai) represents the number of meters the guest is going to take up if he sits at the restaurant table.

Long before the dinner, the guests line up in a queue in front of the restaurant in some order. Then Maxim lets the guests in, one by one. Maxim stops letting the guests in when there is no place at the restaurant table for another guest in the queue. There is no place at the restaurant table for another guest in the queue, if the sum of sizes of all guests in the restaurant plus the size of this guest from the queue is larger than p. In this case, not to offend the guest who has no place at the table, Maxim doesn‘t let any other guest in the restaurant, even if one of the following guests in the queue would have fit in at the table.

Maxim is now wondering, what is the average number of visitors who have come to the restaurant for all possible n! orders of guests in the queue. Help Maxim, calculate this number.

Input

The first line contains integer n (1 ≤ n ≤ 50) — the number of guests in the restaurant. The next line contains integers a1, a2, ..., an(1 ≤ ai ≤ 50) — the guests‘ sizes in meters. The third line contains integer p (1 ≤ p ≤ 50) — the table‘s length in meters.

The numbers in the lines are separated by single spaces.

Output

In a single line print a real number — the answer to the problem. The answer will be considered correct, if the absolute or relative error doesn‘t exceed 10 - 4.

Examples

input

Copy

31 2 33

output

Copy

1.3333333333

Note

In the first sample the people will come in the following orders:

  • (1, 2, 3) — there will be two people in the restaurant;
  • (1, 3, 2) — there will be one person in the restaurant;
  • (2, 1, 3) — there will be two people in the restaurant;
  • (2, 3, 1) — there will be one person in the restaurant;
  • (3, 1, 2) — there will be one person in the restaurant;
  • (3, 2, 1) — there will be one person in the restaurant.

In total we get (2 + 1 + 2 + 1 + 1 + 1) / 6 = 8 / 6 = 1.(3).

题解:

令dp[i][j][k]表示前i个取j个和为k的期望

考虑转移到i的时候,无非是a[i]取或者不取

取的次数占总次数的比为c(i-1,j-1)/c(i,j)=j/i

所以不取的占比为1-j/i=(i-j)/i

故得到转移方程

dp[i][j][k]=j/i*dp[i-1][j-1][k-a[i]]+(i-j)/i*dp[i-1][j][k]

代码如下:

#include<bits/stdc++.h>
using namespace std;

double dp[66][66][66];
double fac[66];
int n,p,a[66];

int main()
{
    dp[0][0][0]=1.0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    scanf("%d",&p);
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<=i;j++)
        {
            for(int k=0;k<=p;k++)
            {
                dp[i][j][k]+=dp[i-1][j][k]*(i-j)/i;
                if(k-a[i]>=0)
                {
                    dp[i][j][k]+=dp[i-1][j-1][k-a[i]]*j/i;
                }
            }
        }
    }
    double ans=0.0;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=p;j++)
        {
            ans+=dp[n][i][j];
        }
    }
    printf("%.5lf\n",ans);
}

原文地址:https://www.cnblogs.com/stxy-ferryman/p/9867733.html

时间: 2024-10-17 01:07:04

codeforces 261B Maxim and Restaurant(概率DP)的相关文章

CodeForces 540D Bad Luck Island 概率dp

CodeForces 540D 应该是简单概率dp,由于写得少显得十分蠢萌 求期望逆推,求概率正推,大概是这么个意思,贴一发留恋 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define db double const int maxn=108; db dp[maxn][maxn][maxn]; int main() { int i,j,n,m,k,p; whi

Codeforces 148D Bag of mice (概率dp)

D. Bag of mice time limit per test:2 seconds memory limit per test:256 megabytes The dragon and the princess are arguing about what to do on the New Year's Eve. The dragon suggests flying to the mountains to watch fairies dancing in the moonlight, wh

Codeforces 518D Ilya and Escalator (概率dp)

Ilya and Escalator time limit per test: 2 seconds memory limit per test: 256 megabytes Ilya got tired of sports programming, left university and got a job in the subway. He was given the task to determine the escalator load factor. Let's assume that

【CodeForces 261B】Maxim and Restaurant(DP,期望)

题目链接 第一种解法是$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> #

Codeforces 513G1 513G2 Inversions problem 概率dp

题目链接:点击打开链接 题意: 给定n ,k 下面n个数表示有一个n的排列, 每次操作等概率翻转一个区间,操作k次. 问: k次操作后逆序数对个数的期望. 思路: dp[i][j]表示 a[i] 在a[j] j前面的概率 初始就是 dp[i][j]  = 1( i < j ) 则对于翻转区间 [i, j], 出现的概率 P = 1 / ( n * (n+1) /2) 并且会导致 [i, j]内元素位置交换,枚举这次翻转的区间时所有的转移情况 #include <stdio.h> #inc

CodeForces 148D-Bag of mice(概率dp)

题意: 袋子里有w个白球b个黑球,现在两个人轮流每次取一个球(不放回),先取到白球的获胜,当后手取走一个球时,袋子里的球会随机的漏掉一个,问先手获胜的概率. 分析: dp[i][j]表示袋子中i个白球j个黑球,先手取获胜的概率. 有四种情况 先手取到白球,获胜概率1.0*i/(i+j); 后手取到白球,先手输 前两次都取到黑球,漏掉一个黑球,转移到dp[i][j-3] 前两次都取到黑球,漏掉一个白球,转移到dp[i-1][j-2] #include <map> #include <set

CodeForces 499D. Name That Tune(概率dp)

It turns out that you are a great fan of rock band AC/PE. Peter learned that and started the following game: he plays the first song of the list of n songs of the group, and you have to find out the name of the song. After you tell the song name, Pet

codeforces Problem-518D:Ilya and Escalator(概率dp)

传送门 题意:一共有n个人排着队,排在队首的人每一秒有p的概率上车,求过了t秒后车内的人数的期望值. 题解:用dp[i][j]表示第i秒有j个人的概率,状态转移方程为:dp[i][j]=p*dp[i-1][j-1]+(1-p)*dp[i-1][j](i<n),dp[i][j]=p*dp[i-1][j-1]+dp[i-1][j](i==n); AC代码: #include <bits/stdc++.h> using namespace std; const int maxn=2e3+4;

cf 261B.Maxim and Restaurant

什么什么期望的,不会! (题解http://blog.sina.com.cn/s/blog_140e100580102wj4e.html(看不懂)) #include<bits/stdc++.h> #define LL long long #define LD long double #define N 100005 using namespace std; inline int ra() { int x=0,f=1; char ch=getchar(); while (ch<'0' |