题目链接
BZOJ:https://www.lydsy.com/JudgeOnline/problem.php?id=1426
洛谷:https://www.luogu.org/problemnew/show/P4550
Solution
期望题思路就是清奇...
设(f(i))表示当前收集了(i)张,集满还需要多少张,显然(f(n)=0)。
我们可以枚举当前这张有没有选中没有的,得到:
[f(i)=frac{i}{n}f(i)+frac{n-i}{n}f(i+1)+1
]
化简一下:
[f(i)=f(i+1)+frac{n}{n-i}
]
然后考虑费用,设(g(i))表示当前收集了(i)张,集满所需的费用,这里假定当前这张一元钱,后面的以此类推,同样的(g(n)=0)。
那么我们根据上面的思路可以得到:
[g(i)=frac{i}{n}(g(i)+f(i))+frac{n-i}{n}(g(i+1)+f(i+1))+1
]
加了(f(i) or f(i+1))是因为当前多了一张,后面每一张都要多一元钱。
化简一下:
[g(i)=frac{i}{n-i}f(i)+f(i+1)+g(i+1)+frac{n}{n-i}
]
直接暴力递推就好了。当然你可以发现这题不需要开数组
#include<cstdio>
double f1,f2,t,g1,g2;int n;
int main() {
scanf("%d",&n);
for(int i=n-1;~i;i--) t=f1+1.0*n/(n-i),f2=f1,f1=t,t=1.0*i/(n-i)*f1+g1+f2+1.0*n/(n-i),g2=g1,g1=t;
printf("%.2lf
",g1);
return 0;
}