「UVA1636」Headshot(概率
题意翻译
你有一把枪(左轮的),你随机装了一些子弹,你开了一枪,发现没有子弹,你希望下一枪也没有子弹,你是应该直接开一枪(输出"SHOOT"),还是先转一下,再开一枪(输出"ROTATE")?如果两种情况下一枪没子弹的概率相等,输出"EQUAL"。 注意:这里转一下,并不是转到下一个位置,而是随机转,即等概率转到子弹序列的每一个位置上。 手枪里的子弹序列可以看做二进制序列,例如0011,第一次开枪前,一定在位置1或2(因为你的第一枪没打出子弹去),因此开枪后位于位置2或3,如果此时开枪,有一半的概率打不出子弹。补充一下,子弹序列是环形序列,即0011等同于0110,1100,1001;
数据保证子弹序列长度为2~100
读入为多组数据 输入样例 0011 0111 000111 输出样例 EQUAL ROTATE SHOOT
题目描述
输入输出格式
输入格式:
输出格式:
输入输出样例
暂无测试点
题解
对于直接开枪,记一下有多少个$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 }