UVA1636 决斗 Headshot
UVA1636 决斗 Headshot
你有一把枪(左轮的),你随机装了一些子弹,你开了一枪,发现没有子弹,你希望下一枪也没有子弹,你是应该直接开一枪(输出"SHOOT"),还是先转一下,再开一枪(输出"ROTATE")?如果两种情况下一枪没子弹的概率相等,输出"EQUAL"。 注意:这里转一下,并不是转到下一个位置,而是随机转,即等概率转到子弹序列的每一个位置上。 手枪里的子弹序列可以看做二进制序列,例如0011,第一次开枪前,一定在位置1或2(因为你的第一枪没打出子弹去),因此开枪后位于位置2或3,如果此时开枪,有一半的概率打不出子弹。补充一下,子弹序列是环形序列,即0011等同于0110,1100,1001;
数据保证子弹序列长度为2~100
读入为多组数据 输入样例 0011 0111 000111 输出样例 EQUAL ROTATE SHOOT
Solution
把打中的概率表示一下就行
交叉相乘把除法干掉
Code
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<climits>
#define LL long long
#define REP(i, x, y) for(int i = (x);i <= (y);i++)
using namespace std;
int RD(){
int out = 0,flag = 1;char c = getchar();
while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
return flag * out;
}
const int maxn = 110;
int n00, n01, n0, n1, len;
char s[maxn];
void init(){
n00 = n01 = n0 = n1 = 0;
len = strlen(s);
s[len] = s[0];
}
void work(){
REP(i, 0, len - 1){
if(s[i] == '0'){
n0++;
if(s[i + 1] == '1')n01++;
else n00++;
}
if(s[i] == '1')n1++;
}
if(n01 * len == n1 * (n01 + n00))puts("EQUAL");
else if(n01 * len > n1 * (n01 + n00))puts("ROTATE");
else puts("SHOOT");
}
int main(){
while(cin >> s){
init();
work();
}
return 0;
}