1.Headshot UVA - 1636:
分析:
分类讨论,比较两种情况下没有子弹射出的概率大小;
(1).如果直接射击,要使得没有子弹射出,且在第一次没有子弹射出的条件下,即求 \(00\) 串数量占 \(00\) 和 \(01\) 总数量的比例(条件概率);
(2).如果要转一下再射击并保证没有子弹,即求串中 \(0\) 的数量占整个串长度的比例;
代码:
#include <bits/stdc++.h>
using namespace std;
char ss[110];
int main()
{
while(scanf("%s",ss+1)!=EOF)
{
int n=strlen(ss+1);
int a=0,b=0,c=0;
for(int i=1;i<=n;i++)
c+=(ss[i]=='0'?1:0);
for(int i=2;i<=n;i++)
{
if(ss[i]=='0'&&ss[i-1]=='0')
b++;
else if(ss[i]=='1'&&ss[i-1]=='0')
a++;
}
if(ss[n]=='0'&&ss[1]=='0')
b++;
else if(ss[n]=='0'&&ss[1]=='1')
a++;
int x=c*(a+b),y=n*b;
if(y>x)
printf("SHOOT\n");
else if(y<x)
printf("ROTATE\n");
else
printf("EQUAL\n");
}
return 0;
}
2.Cows and Cars UVA - 10491:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a,b,c;
while(scanf("%d%d%d",&a,&b,&c)!=EOF)
{
double ans=(1.0*b*(b-1)+1.0*a*b)/(1.0*(a+b)*(a+b-c-1));
printf("%.5f\n",ans);
}
return 0;
}
3.Probability|Given UVA - 11181:
分析:
由题意可知,该题为一道条件概率。
条件概率公式:
\[P(A_i|B)=\frac{P(A_i*B)}{P(B)} \]
其中,\(P(B)\) 为 \(n\) 个人中恰好有 \(r\) 个人购买商品的概率,\(P(A_i*B)\) 表示 \(n\) 个人中恰好有 \(r\) 个人购买商品且第 \(i\) 个人一定购买的概率。
采用子集枚举的方法,枚举情况求出各个概率。
输入以 \(n=0\) 结束。
代码:
#include <bits/stdc++.h>
using namespace std;
double p[25],ans[25],sum;
void solve(int n,int r)
{
sum=0;
for(int i=0;i<n;i++)
ans[i]=0;
for(int i=0;i<(1<<n);i++)
{
int t=i,cnt=0;
while(t)
{
if(t&1)
cnt++;
t>>=1;
}
if(cnt!=r)
continue;
double tmp=1.0;
for(int j=0;j<n;j++)
tmp=tmp*(((i>>j)&1)?p[j]:1-p[j]);//cout<<"tmp"<<tmp<<endl;
sum+=tmp;
for(int j=0;j<n;j++)
ans[j]+=(((i>>j)&1)?tmp:0);
}
}
int main()
{
int n,r,cot=0;
while(scanf("%d%d",&n,&r),n)
{
for(int i=0;i<n;i++)
scanf("%lf",&p[i]);
solve(n,r);
printf("Case %d:\n",++cot);
for(int i=0;i<n;i++)
printf("%.6f\n",ans[i]/sum);
}
return 0;
}
/*
3 2
0.10
0.20
0.30
5 1
0.10
0.10
0.10
0.10
0.10
*/