写下为了以后不易忘记。
题目:https://vjudge.net/problem/LightOJ-1030
题意: 从一号点出发,每次抛筛子走不能超过终点(超过重新抛),走到n点结束。每个点都有一定的金子,问最后期望得到多少金子。。。
思路:从后往前想,从第n点开始走就只能得到n点的金子, 从n-2开始走可以得到(从n-1出发得到金子期望数)/2+(从n-1出发得到金子期望数)/2 ,往前递推就可以得到从1开始的金子数。
ac代码:
#include <stdio.h>
const int mx = 2e5;
double dp[mx];
int min(int a, int b) {
return a>b?b:a;
}
int main() {
int q, o = 1;
scanf("%d", &q);
while (q--) {
printf("Case %d: ", o++);
int n;
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
scanf("%lf", &dp[i]);
for (int i = n-1; i > 0; --i) {
int mi = min(6, n-i);
for (int j = 1; j <= mi; ++j)
dp[i] += dp[i+j]/mi;
}
printf("%f\n", dp[1]);
}
return 0;
}