题意:有 NNN 个转盘,第 iii 个转盘上有 PiP_iPi 个数 Si,1S_{i,1}Si,1 到 Si,PiS_{i,P_i}Si,Pi,每玩一次转盘会从中随机选取一个数作为这次的得分,每玩一次这个转盘花费 CiC_iCi 元。
求总得分为 MMM 时,花费钱数的期望。
赛时做了一个小时只写出一个错误的贪心,我们不妨从这个失败的贪心出发,聊聊期望类题目的正解做法。
错误思路:
我们不妨考虑如下的贪心策略:
计算出每个转盘上所有数的平均值作为玩一次这个转盘得数的期望,再除以每个转盘玩一次的价格,找到其中的最大值,用 MMM 除以这个最大值得到答案。
部分代码:
for(int i = 1; i <= n; i = i + 1)
{
cin >> c[i] >> p[i];
for(int j = 1; j <= p[i]; j = j + 1)
{
cin >> s;
if(s > m)
s = m; // 赛时写的一个毫无卵用的优化
sum[i] += s;
}
ave[i] = sum[i] / double(p[i]);
ave[i] /= c[i];
}
sort(ave + 1, ave + 1 + n, cmp);
cout << m / ave[1];
这应该算是一个很多人都可能会考虑到的贪心策略了,但是其正确性究竟怎样呢?
考虑这样的数据:
N = 2
M = 100
第一个轮盘玩一次 100 元
0 0 0 0 100
第二个轮盘玩一次 100 元
0 0 0 0 0 0 0 1000
可以计算出,下面的轮盘玩一次平均获得 125125125 元,而上面的轮盘每玩一次平均仅获得 2020