原来就是道简单的概率计算题。。。
根据题目意思那我们知道可以分为两种情况
第一种,不要提示,我直接把所有盒子打开,那么就知道都是什么球了,这时候概率就是1,所有费用加起来乘上1就是期望。。。
第二种,我找小G要了提示需要成本c,那么我现在知道黑球有多少了,如果如果黑球=n个盒子,那么就说明不用开盒子了,如果黑球=0那么也不要开盒子了,如果黑球!=n个,那么我们开盒子,因为是最小期望,那么我们优先开当前花费最小的盒子,知道了当前盒子的球的颜色,那么就可以知道后面球的概率,接下来数学期望的就是了。。
AC代码:
#include <iostream>
#include <math.h>
#include <algorithm>
using namespace std;
double x[100050];
int main(){
int n;
double cost;
cin >> n >> cost;
for(int i = 1;i<=n;i++) cin >> x[i];
sort(x+1,x+n+1); //因为求最小期望,那么可能优先开权值小的
for(int i = 1;i<=n;i++) x[i] = x[i-1] + x[i]; //计算前缀和
double ans = cost;
for(int i = 1;i<=n;i++){ //把所有情况概率加起来
ans += x[i-1] * pow(0.5,n-i+1);
}
if(ans > x[n]) ans = x[n];
printf("%.6lf",ans);
return 0;
}