题意
你有一把随机装了一些子弹的枪,开了一枪,发现没有子弹,你希望下一枪也没有子弹,你是应该直接开一枪(输出"SHOOT"),还是先转一下,再开一枪(输出"ROTATE")?如果两种情况下一枪没子弹的概率相等,输出"EQUAL"。 其中转一下,并不是转到下一个位置,而是随机转,即等概率转到子弹序列的每一个位置上。 手枪里的子弹序列可以看做二进制序列,例如0011,第一次开枪前,一定在位置1或2(因为你的第一枪没打出子弹去),因此开枪后位于位置2或3,如果此时开枪,有一半的概率打不出子弹。子弹序列是环形序列,即0011等同于0110,1100,1001;
数据保证子弹序列长度为[2,100]
分析
开了一枪没子弹,再开一枪还是没子弹的情况其实是有两个连续的00的时候,而再打一枪有子弹就是01。
因此概率就是num(00)/(num(01)+num(00)) 。而对于任意一个0,不是在00中就是在01中(环形序列),所以num(01)+num(00)=num(0)。
而开一枪没子弹就是0的时候,开一枪有子弹的时候就是1,因此概率是num(0)/(num(0)+num(1))
比较一下哪个大就选哪个
代码
#include<bits/stdc++.h> using namespace std; string s; int n,num0,num1,num00; int main() { while(cin>>s) { n=s.length();num0=num1=num00=0; for(int i=0;i<n-1;i++) { if(s[i]=='0')num0++; if(s[i]=='0'&&s[i+1]=='0')num00++; } if(s[n-1]=='0')num0++; if(s[0]=='0'&&s[n-1]=='0')num00++; if(num00*n==num0*num0)cout<<"EQUAL"<<endl; else if(num00*n>num0*num0)cout<<"SHOOT"<<endl; else cout<<"ROTATE"<<endl; } return 0; }