「UVA1636」Headshot(概率

Posted qwerta

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「UVA1636」Headshot(概率相关的知识,希望对你有一定的参考价值。

题意翻译

你有一把枪(左轮的),你随机装了一些子弹,你开了一枪,发现没有子弹,你希望下一枪也没有子弹,你是应该直接开一枪(输出"SHOOT"),还是先转一下,再开一枪(输出"ROTATE")?如果两种情况下一枪没子弹的概率相等,输出"EQUAL"。 注意:这里转一下,并不是转到下一个位置,而是随机转,即等概率转到子弹序列的每一个位置上。 手枪里的子弹序列可以看做二进制序列,例如0011,第一次开枪前,一定在位置1或2(因为你的第一枪没打出子弹去),因此开枪后位于位置2或3,如果此时开枪,有一半的概率打不出子弹。补充一下,子弹序列是环形序列,即0011等同于0110,1100,1001;

数据保证子弹序列长度为2~100

读入为多组数据 输入样例 0011 0111 000111 输出样例 EQUAL ROTATE SHOOT

题目描述

PDF

输入输出格式

输入格式:

 

输出格式:

 

输入输出样例

暂无测试点

题解

对于直接开枪,记一下有多少个$0$,再记一下其中有多少个$0$的后一位为$1$,挂掉的概率为$(01的数量)/(0的数量)$.

转一下的概率就是$(0的数量)/(序列长度)$

然后比较一下就好了.

懒得处理精度,用了交叉相乘.

 1  qwerta 
 2 UVA1636 Headshot Accepted 
 3 代码 C++,0.46KB
 4 提交时间 2018-10-26 17:13:47
 5 耗时/内存 0ms, 0KB
 6 
 7 #include<iostream>
 8 #include<cstdio>
 9 using namespace std;
10 string s;
11 int main()
12 {
13     while(cin>>s)
14     {
15         int zr=0;//记录0的个数
16         for(int i=0;i<s.length();++i)
17         if(s[i]==0)zr++;
18         //shoot
19         int dy=0;//记录01的个数
20         for(int i=0;i<s.length()-1;++i)
21         if(s[i]==0&&s[i+1]==1)dy++;
22         int n=s.length();
23         if(s[n-1]==0&&s[0]==1)dy++;//别忘了它是环形的
24         //
25         int y=s.length()-zr;//算1的个数
26         if(dy*n<zr*y){cout<<"SHOOT"<<endl;}//如果dy/zr<y/n
27         else if(dy*n==zr*y){cout<<"EQUAL"<<endl;}
28         else cout<<"ROTATE"<<endl;
29     }
30     return 0;
31 }

 

以上是关于「UVA1636」Headshot(概率的主要内容,如果未能解决你的问题,请参考以下文章

uva 1636 Headshot

[UVa1636]Headshot

uva-1636-概率

UVa 1636 决斗

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

UVA-10828 (概率期望+高斯消元)