LightOJ 1030 Discovering Gold(期望)

题意:唔……这是适合男女独处一室时玩的……紧张又刺激的飞行棋。就是飞行棋的规则,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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章