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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章