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;
	}
posted @ 2021-03-29 19:23  Tony_Double_Sky  阅读(36)  评论(0编辑  收藏  举报