B.Box
题目传送门:
题面:
题目大意:
面前有n个箱子,里面是黑球是白球的概率都一样。知道里面是什么球的方法只有打开它,花费
w
i
w_i
wi代价。或者花费C询问获得未打开里面黑球的数量。
问最小代价期望。
思路:
实际上只有两种情况:
- 询问一次;
- 不询问。
因为询问一次后可以通过新打开盒子内部情况动态获得当前黑白球剩余数量,所以问了无论何时问都是一样的,所以只有问了和没问区别。
结果取个min就好。
因为开哪个都一样,所以我们选择代价从小到大开。
剩下的就等于一个随机 01 序列
从前往后开,开到一个后缀全是同色的为止。
代价:C + Σ wi(1-1/(2^(n-i)))
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=114514;
double p[maxn];
double sum[maxn];
const double eps = 1e-8;
int main()
{
int n;
double c;
cin >> n >> c;
double tot = 0;
for (int i = 1; i <= n; i++)
cin >> p[i], tot += p[i];
sort(p + 1, p + 1 + n);
for (int i = 1; i <= n; i++)
{
sum[i] = sum[i - 1] + p[i];
}
double div = 2, ans = c;
for (int i = n - 1; i >= 1; i--)
{
ans += sum[i] / div;
div = div * 2.0;
}
cout << fixed << setprecision(8) << min(tot, ans) << '\n';
}