MYF

UVa 1636 Headshot

题目链接

UVa 1636

方法:环形统计

题目分析

题目大意

左轮手枪,里面有一个轮,轮上有的有子弹,有的没有子弹。给一个字符串,0表示没有子弹,1表示有子弹。现在,你前面的一个人已经扣下扳机,没有子弹,现在手枪传递到你手上,你可以选择开枪打下一颗子弹,或者rotate一下再开枪,问哪种选择你的存活率会更高。

解析

rotate的概率计算方法:空子弹数/子弹腔数

shoot的概率计算方法:”00”的组数/“0X”的组数 (其中X可以为0或者是1)

比较这两个概率的大小即可。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <set>
#include <map>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <vector>
#include <iomanip>
#include <cstring>
#include <iostream>
#include <algorithm>
#define PI acos(-1)
#define debug printf("Hi----------\n")
#define eps 1e-8
#define INF 0x3f3f3f3f
#pragma comment(linker, "/STACK:1024000000,1024000000")
typedef long long ll;
using namespace std;
#define maxn 10005
int main(){
char s[105];
while (scanf("%s",s)!=EOF) {
int len=strlen(s);
int zero=0,cnt1=0,cnt2=0;//cnt1 记录 “0 0”组的数量
//cnt2 记录 “0 X”组的数量
//zero 记录 "0"的数量 zero=cnt2

//最后一颗和第一颗的组合
if (s[0]=='0'&&s[len-1]=='0') cnt1++;

for (int i=0; i<len; i++) {
if (s[i]=='0') zero++;
if (i>0&&s[i]=='0'&&s[i-1]=='0') cnt1++;
}

cnt2=zero;

if (zero*cnt2>cnt1*len)
cout<<"ROTATE"<<endl;
else if (zero*zero==cnt1*len)
cout<<"EQUAL"<<endl;
else
cout<<"SHOOT"<<endl;

}
}