牛客2021暑期训练5-B-Boxes
题意
有 n 个盒子,每个盒子有黑球或白球,打开盒子需要 wi 的代价,同时可以提示当前未打开的盒子里共有多少个黑球,代价为 C,求知到所有球的期望
题解
当我们使用 C 时,之后每打开一个盒子都可以知道后续还有多少黑球,也就是说我们只需要使用一次 C,且在开始使用最优,直到后面颜色一样就可以结束。因此就有两种方案
不用 C,直接打开全部盒子,代价为 w[i] 之和
用 C,每次都有概率结束(后面全都是白球或全都是黑球)且概率为
1
2
n
−
i
×
2
\frac{1}{2^{n-i}}×2
2n−i1×2,乘2是因为黑白两色,所以将 w 升序枚举到 n-1
两者取小
代码
#include<bits/stdc++.h>
#define DB double
using namespace std;
const int N=1e5+9;
int n;
DB c,ans,p=0.5;
DB w[N];
int main()
{
cin>>n>>c;
for(int i=1;i<=n;i++)
cin>>w[i];
sort(w+1,w+1+n);
for(int i=1;i<=n;i++)
w[i]+=w[i-1];
for(int i=n-1;i>=1;i--)
{
ans+=w[i]*p;
p*=0.5;
}
printf("%.6lf",min(ans+c,w[n]));
return 0;
}