UVa1636

来源:互联网 发布:各种网络流行用语 编辑:程序博客网 时间:2024/05/21 14:05

题目链接

简介:
你和人决斗
决斗规则如下:用一把有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;}