UVA&&POJ离散概率练习[3]

POJ3869 Headshot

题意:给出左轮手枪的子弹序列,打了一枪没子弹,要使下一枪也没子弹概率最大应该rotate还是shoot

条件概率,|00|/(|00|+|01|)和|0|/n谁大的问题

|00|+|01|=|0|

注意序列是环形

//
//  main.cpp
//  poj3869
//
//  Created by Candy on 25/10/2016.
//  Copyright © 2016 Candy. All rights reserved.
//

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=105;
int n,a,b;
char s[N];
int main(int argc, const char * argv[]) {
    scanf("%s",s+1);
    n=strlen(s+1);
    for(int i=1;i<=n;i++){
        if(s[i]==‘0‘) b++;
        if(s[i]==‘0‘&&s[i+1]==‘0‘) a++;
    }
    if(s[n]==‘0‘&&s[1]==‘0‘) a++;
    if(a*n>b*b) printf("SHOOT");
    else if(a*n==b*b) printf("EQUAL");
    else printf("ROTATE");
    return 0;
}




UVA - 10491

Cows and Cars

经典问题,a奶牛,b车,c门展示

全概率公式,分成一开始选了牛a/(a+b)和一开始选了车b/(a+b)两部分

部分里总是换门得到车概率分别是b/(a+b-c-1)和(b-1)/...

#include <cstdio>
double a,b,c;
int main(int argc, const char * argv[]) {
    while(scanf("%lf%lf%lf",&a,&b,&c)!=EOF)
        printf("%.5f\n",(a*b+b*(b-1))/((a+b)*(a+b-c-1)));
    return 0;
}



UVA - 11181

Probability|Given

题意:n个人,买东西概率pi,有r个人买了东西,求每个人实际买东西概率

条件概率

E为r个人买东西,Ei为r个人中有i买东西

P(Ei|E)=P(EiE)/P(E)

计算概率用dfs爆搜每个人买还是不买即可

PS:不要读入优化,浮点数

//
//  main.cpp
//  uva11181
//
//  Created by Candy on 25/10/2016.
//  Copyright © 2016 Candy. All rights reserved.
//

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=25;
typedef long long ll;
inline int read(){
    char c=getchar();int x=0,f=1;
    while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
    return x*f;
}
int n,r,vis[N];
double p[N],pe[N];
void dfs(int d,int cnt,double prob){//printf("dfs %d %d %f\n",d,cnt,prob);
    if(cnt>r||d-1-cnt>n-r) return;
    if(d==n+1){
        if(cnt==r)
            for(int i=1;i<=n;i++) if(vis[i]) pe[i]+=prob;
        pe[0]+=prob;
        return;
    }
    vis[d]=1;
    dfs(d+1,cnt+1,prob*p[d]);
    vis[d]=0;
    dfs(d+1,cnt,prob*(1-p[d]));
}
int main(int argc, const char * argv[]){
    int cas=0;
    while((n=read())){printf("Case %d:\n",++cas);
        r=read();
        for(int i=1;i<=n;i++) scanf("%lf",&p[i]);
        memset(vis,0,sizeof(vis));
        memset(pe,0,sizeof(pe));
        dfs(1,0,1.0);
        for(int i=1;i<=n;i++) printf("%.6f\n",pe[i]/pe[0]);
    }

    return 0;
}
时间: 2024-12-24 06:25:32

UVA&&POJ离散概率练习[3]的相关文章

poj 2151 概率dp

//poj 2151 概率dp 1 #include "iostream" 2 #include "cstdio" 3 #include "cstring" 4 #include "algorithm" 5 using namespace std; 6 double dp[33][33]; 7 int M, T, N; //problem, team, least 8 double p[1010][33]; 9 int mai

UVA 11021 - Tribles(概率递推)

UVA 11021 - Tribles 题目链接 题意:k个毛球,每个毛球死后会产生i个毛球的概率为pi,问m天后,所有毛球都死亡的概率 思路:f[i]为一个毛球第i天死亡的概率,那么 f(i)=p0+p1f(i?1)+p2f(i?1)2+...+pnf(i?1)n 然后k个毛球利用乘法定理,答案为f(m)k 代码: #include <stdio.h> #include <string.h> #include <math.h> const int N = 1005;

UVA 10288 - Coupons(概率递推)

UVA 10288 - Coupons 题目链接 题意:n个张票,每张票取到概率等价,问连续取一定次数后,拥有所有的票的期望 思路:递推,f[i]表示还差i张票的时候期望,那么递推式为 f(i)=f(i)?(n?i)/n+f(i?1)?i/n+1 化简后递推即可,输出要输出分数比较麻烦 代码: #include <cstdio> #include <cstring> #include <cmath> long long gcd(long long a, long lon

UVA 11291 - Smeech(概率+词法分析)

UVA 11291 - Smeech 题目链接 题意:给定一个表达式形如e=(p,e1,e2) 该表达式的值为 p?(e1+e2)+(1?p)?(e1?e2),求出值 思路:题目是很水,但是处理起来还挺麻烦的,模拟写编译器LEX分析器原理去写了. 代码: #include <cstdio> #include <cstring> const int N = 100005; char str[N]; int now, len, token; double value; void get

UVA 11346 - Probability(概率)

UVA 11346 - Probability 题目链接 题意:给定a,b,s要求在[-a,a]选定x,在[-b,b]选定y,使得(0, 0)和(x, y)组成的矩形面积大于s,求概率 思路:这样其实就是求xy > s的概率,那么画出图形,只要求y = s / x的原函数, y = slnx,带入两点相减就能求出面积,面积比去总面积就是概率 代码: #include <cstdio> #include <cstring> #include <cmath> int

uva 10288 - Coupons(概率)

题目链接:uva 10288 - Coupons 题目大意:给定n,为有n中兑换卷,现在每开一次箱子,就能等概率的获得其中的一种兑换卷.问说平均情况下需要开多少个箱子才能集齐n种兑换卷. 解题思路:dp[i]表示还有i种没获得,dp[i]=n?in?dp[i]+in?dp[i?1]+1 ===>dp[i]=dp[i?1]+ni #include <cstdio> #include <cstring> #include <algorithm> using names

POJ 3701 概率DP

给定2^n 支足球队进行比赛,n<=7. 队伍两两之间有一个获胜的概率,求每一个队伍赢得最后比赛的概率是多少? 状态其实都是很显然的,一开始觉得这个问题很难啊,不会.dp[i][j] 表示第i支队伍赢得前j轮比赛的概率.(这个题目处理区间的时候比较恶心,小心点即可). 1:   2: #include <iostream> 3: #include <cstdio> 4: #include <cstring> 5: #include <map> 6: #

UVA 11971 - Polygon(概率+几何概型)

UVA 11971 - Polygon 题目链接 题意:给一条长为n的线段,要选k个点,分成k + 1段,问这k + 1段能组成k + 1边形的概率 思路:对于n边形而言,n - 1条边的和要大于另外那条边,然后先考虑3边和4边形的情况,根据公式在坐标系中画出来的图,总面积为x,而不满足的面积被分成几块,每块面积为x/2k,然后在观察发现一共是k + 1块,所以符合的面积为x?x?(k+1)/2k,这样一来除以总面积就得到了概率1?(k+1)/2k 代码: #include <cstdio>

poj 3744 概率dp+矩阵快速幂

题意:在一条布满地雷的路上,你现在的起点在1处.在N个点处布有地雷,1<=N<=10.地雷点的坐标范围:[1,100000000]. 每次前进p的概率前进一步,1-p的概率前进1-p步.问顺利通过这条路的概率.就是不要走到有地雷的地方. 设dp[i]表示到达i点的概率,则 初始值 dp[1]=1. 很容易想到转移方程: dp[i]=p*dp[i-1]+(1-p)*dp[i-2]; 但是由于坐标的范围很大,直接这样求是不行的,而且当中的某些点还存在地雷. N个有地雷的点的坐标为 x[1],x[2