UVa1636 - Headshot(概率初步)

题目链接

简介:
你和人决斗
决斗规则如下:用一把有n个弹槽的左轮手枪,对着自己脑袋来一枪,孰生孰死看天意。现在对方已经装了若干发子弹,并随机转了一下转轮,子弹呢用一个01序列表示,0表示这个弹槽无子弹,1表示有子弹。对方先对着自个脑袋开了一枪,嗯,你只听到了一声’click’,人还好好的,是空枪。现在轮到你了,摆在你面前的有两个选择,一是直接对自己开射,二是转一下转轮再来开射,显然你会选择生还希望更大的那种。
现在要做的就是根据子弹装填的序列,进行判断,如果直接shot生还希望大输出”SHOOT”,如果转一下生还希望大输出”ROTATE”,两种选择生还希望相同输出“EQUAL”

分析:
第一枪没有子弹的概率是一个条件概率
直接在抠一枪相当于是一个00序列,随机转一下再抠相当于是恰好遇到0
前者的是一个条件概率:一开始是空枪,也就是说起始状态一定是0,
因此概率等于00的个数除以00+01的个数(实际上00+01就是0的个数)
后者是0的比率

设00序列的个数是a**(注意子弹是环形的,首尾连续)**,0的个数是b,串的长度是n,
那么两个概率分别是a/b,b/n
为了避免精度问题,比较a*n和b*b的大小即可

//这里写代码片
#include<cstdio>
#include<cstring>

using namespace std;

int main()
{
    char s[105];
    while (scanf("%s",&s)!=EOF)
    {
        int n=strlen(s);
        int a=0,b=0;
        for (int i=0;i<n;i++)
        {
            if (s[i]=='0') b++;
            if (i>0&&s[i]=='0'&&s[i-1]=='0') a++;
        }
        if (s[0]=='0'&&s[n-1]=='0') a++;

        if (a*n>b*b) printf("SHOOT\n");
        else if (a*n<b*b) printf("ROTATE\n");
        else printf("EQUAL\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值