【UVA1636】决斗Headshot

题意

你有一把随机装了一些子弹的枪,开了一枪,发现没有子弹,你希望下一枪也没有子弹,你是应该直接开一枪(输出"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;  
}  

 

转载于:https://www.cnblogs.com/NSD-email0820/p/9873583.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值