uva 1636 Headshot

原题:
You have a revolver gun with a cylinder that has n chambers. Chambers are located in a circle on a
cylinder. Each chamber can be empty or can contain a round. One chamber is aligned with the gun’s barrel. When trigger of the gun is pulled, the gun’s cylinder rotates, aligning the next chamber with the barrel, hammer strikes the round, making a shot by firing a bullet through the barrel. If the chamber is empty when the hammer strikes it, then there is no shot but just a “click”.
uva 1636 Headshot_第1张图片
You have found a use for this gun. You are playing Russian Roulette with your friend. Your friend
loads rounds into some chambers, randomly rotates the cylinder, aligning a random chamber with a gun’s barrel, puts the gun to his head and pulls the trigger. You hear “click” and nothing else the chamber was empty and the gun did not shoot.Now it is your turn to put the gun to your head and pull the trigger. You have a choice. You can either pull the trigger right away or you can randomly rotate the gun’s cylinder and then pull the trigger. What should you choose to maximize the chances of your survival?
Input
The input file contains several datasets. A dataset consists of a single line with a string of n digits ‘0’and ‘1’ (2 ≤ n ≤ 100). This line of digits represents the pattern of rounds that were loaded into the gun’s chambers. ‘0’ represent an empty chamber, ‘1’ represent a loaded one. In this representation,when cylinder rotates before a shot, the next chamber to the right gets aligned with the barrel for a shot. Since the chambers are actually located on a circle, the first chamber in this string follows the last one. There is at least one ‘0’ in this string.
Output
For each dataset, write to the output file one of the following words (without quotes):
• ‘SHOOT’ — if pulling the trigger right away makes you less likely to be actually shot in the head
with the bullet (more likely that the chamber will be empty).
• ‘ROTATE’ — if randomly rotating the cylinder before pulling the trigger makes you less likely to
be actually shot in the head with the bullet (more likely that the chamber will be empty).
• ‘EQUAL’ — if both of the above choices are equal in terms of probability of being shot.

Sample Input
0011
0111
000111
Sample Output
EQUAL
ROTATE
SHOOT
大意:
给你一把左轮手枪,枪里面的分布用0和1表示,起始位置一定是在一个0的位置。现在让你在自己脑袋上来一枪,你有两种选择,一个是直接抠扳机,令一种给让弹夹随便旋转一圈然后在给自己来一枪。现在问你,如果如果你想活下来,在这两个方案中选一个最好的,如果两种方案的概率相同,输出EQUAL。
这里注意,假设你现在的扳机对准的是i位置,那么将打出去i+1位置。

#include<bits/stdc++.h>
using namespace std;

//fstream in,out;

int main()
{
    ios::sync_with_stdio(false);
// in.open("data.txt");
// out.open("input.txt");
    string s;
    double sho,rot,stot,rtot;
    while(cin>>s)
    {
        sho=rot=stot=0;
        rtot=s.size();
        s+=s[0];
        for(int i=0;i<s.size()-1;i++)
        {
            if(s[i]=='0')
            {
                if(s[i+1]=='0')
                    sho++;
                stot++;
            }
        }
        rot=stot;
        if(sho/stot==rot/rtot)
            cout<<"EQUAL"<<endl;
        else
        {
            if(sho/stot>rot/rtot)
                cout<<"SHOOT"<<endl;
            else
                cout<<"ROTATE"<<endl;
        }
    }
// in.close();
// out.close();
    return 0;
}

解答:
在lrj紫书上看到的题目,简单的读了下题后写了程序交上去就wa了。后来又仔细读了一遍题,发现题目理解错了,非常简单的一道题目。
对于一个01序列,考虑两种情况,一个是直接打枪,另一种是转一圈再打枪。计算方法如下

//比如有数据
000101

直接shoot的情况
 000101
 ++- -
 由于是直接打枪,那么起始位置一定是在0位置。加好表示在这个位置开枪能活下来,减号表示狗带。所以shoot活下来的概率为1/2、
 转一圈
 000101
 ++-+-+
 转一圈后变成的位置是随机的,所以活下来的概率是4/6。
 所以样例应该输出ROTATE

你可能感兴趣的:(uva)