题意:唔……这是适合男女独处一室时玩的……紧张又刺激的飞行棋。就是飞行棋的规则,n个点,一个六面的骰子,一开始在1这个位置,每个位置都有一个价值,问你走到最后一个点取得的价值的期望是多少。
分析:我们可以算出来走每个位置的概率,用这个位置的价值乘以概率,加起来就是期望了。对于一每个点,都可以从在他前面和它的距离<= 6的点转移过来,但是要考虑到,最后面几个点在转移的时候不是乘1/6。
#include<cstdio>
#include<cstring>
using namespace std;
double a[1000];
int c[1000];
int main(){
int T, n, kase = 0;
scanf("%d", &T);
while(T--){
double ans = 0;
memset(a, 0, sizeof(a));
memset(c, 0, sizeof(c));
scanf("%d", &n);
for(int i = 1; i <= n; i++){
scanf("%d", &c[i]);
}
a[1] = a[n] = 1;
ans = c[1];
if(n != 1) ans += c[n];
for(int i = 2; i < n; i++){
for(int j = i - 6 < 1 ? 1 : i - 6; j <= i - 1; j++){
if(n - j >= 6){
a[i] += a[j] * 1.0/6;
}else{
a[i] += a[j] * 1.0/(n - j);
}
}
ans += (double) c[i] * a[i];
}
printf("Case %d: %lf\n", ++kase, ans);
}
return 0;
}