题解:CF1267G Game Relics
题目大意
共有
需要求出购买所有圣物所需的最小期望碎片数量。
思路
容易发现,最优策略是先随机购买,再买下剩下的圣物。
设当前有
每次通过随机的方式获得一个新圣物的概率为
每次通过直接购买一个圣物的期望花费为
知道了这些,我们要如何算出答案呢?
考虑到直接设计期望
再设
那么答案就是
代码
#include<bits/stdc++.h>
using namespace std;
int n,x,a[114],tot;
double p[114][11451],dp[114][11451],ans,c[114][114];
inline int read(){
int x=0,f=1;char ch=getchar();
for(;ch>'9'||ch<'0';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<1)+(x<<3)+(ch^48);
return x*f;
}
int main(){
n=read();x=read();
for(int i=1;i<=n;i++)a[i]=read();
c[0][0]=1;
for(int i=1;i<=n;i++){
c[i][0]=1;
for(int j=1;j<=i;j++)c[i][j]=c[i-1][j]+c[i-1][j-1];
}
p[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=i-1;~j;j--)for(int k=tot;~k;k--)p[j+1][k+a[i]]+=p[j][k];
tot+=a[i];
}
for(int i=0;i<n;i++)for(int j=0;j<=tot;j++)p[i][j]/=c[n][i];
for(int i=0;i<n;i++)for(int j=0;j<=tot;j++)dp[i][j]=min(1.0*(tot-j)/(n-i),(1.0*n/(n-i)+1)*x/2);
for(int i=0;i<n;i++)for(int j=0;j<=tot;j++)ans+=dp[i][j]*p[i][j];
printf("%.17lf",ans);
return 0;
}