UVa 11021

Type: 概率

题解

有点难以理解题解的递推式,把那句f(i-1)表示i-1天后全部死亡改成f(i-1)表示i-1天后一个不生的概率可能更好理解一点吧

不知道怎么证明这个式子,思维还是不强

Code

#include<bits/stdc++.h>
using namespace std;
const int maxn=1010;

double f[maxn],P[maxn];;
int n,k,m,T;

int main(){
    cin>>T;
    for(int i=1;i<=T;++i){
        cin>>n>>k>>m;
        for(int j=0;j<n;++j) cin>>P[j];
        f[0]=0;f[1]=P[0];
        for(int j=2;j<=m;++j){
            f[j]=0;
            for(int t=0;t<n;++t){
                f[j]+=(P[t]*pow(f[j-1],t));
            }
        }
        printf("Case #%d: %.7lf\n",i,pow(f[m],k));
    }
    return 0;
}

UVa 11181 + UVa 10491

【类型】

第一题:dfs 全概率 回溯

第二题:全概率

【Tip】

条件概率:

P(A|B)=P(AB)|P(B).  P(A|B)指.在事件B的前提下,发生A的概率.

P(AB)指两个时间A和B同时发生的概率.P(AB)=P(A)P(B).

全概率:

P(A)=P(A|B1)P(B1)+P(A|B2)P(B2)+…+P(A|Bn)*P(Bn).

【Code】

11181:

#include <stdio.h>
#include <string.h>
const int N = 30;

int n;
double p[N], ans[N];

double dfs(int c, int k, double pi) {
    if (c > n) return k ? 0 : pi;

    double sum = 0;
       if (k) {
        sum += dfs(c + 1, k – 1, pi * p[c]);//选择
        ans[c] += sum;
    }

    sum += dfs(c + 1, k, pi * (1 – p[c])); //回溯
    return sum;
}

int main () {
    int r, cas = 1;
    while (scanf(“%d%d”, &n, &r), n + r) {
        for (int i = 1; i <= n; i++)
            scanf(“%lf”, &p[i]);
        memset(ans, 0, sizeof(ans));

        printf(“Case %d:\n”, cas++);
        double P = dfs(1, r, 1);

        for (int i = 1; i <= n; i++)
            printf(“%.6lf\n”, ans[i] / P);
    }
    return 0;
}

10491:

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int main(){
    int a,b,c;
    while(cin>>a>>b>>c){
        printf(“%.5lf\n”,1.0*(a*b+b*(b-1))/((a+b-c-1)*(a+b)));
    }
    return 0;
}

UVa 1636

【类型】

概率论

【思路】

水题一发.

紫书 P326.

第一个

A: 第二枪无子弹
B: 第一枪无子弹
第二种情况是随机转到0的概率是多大

即 0的个数/n

P(A|B)=P(AB) / P(B) = 00个数/0个数

【Code】

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int main(){
        char str[200];
        while(scanf("%s",str)!=EOF){
            int a=0,b=0;
            int len=strlen(str);
            for(int i=0;i<len;++i){
                if(str[i]=='0'){
                    b++;
                    if(str[(i+1)%len]=='0') a++;
                }
            }
            if(a*len==b*b) printf("EQUAL\n");
            if(a*len>b*b) printf("SHOOT\n");
            if(a*len<b*b) printf("ROTATE\n");
        }
        return 0;
    }