码迷,mamicode.com
首页 > 其他好文 > 详细

UVa 1636 - Headshot(概率)

时间:2018-04-23 22:45:10      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:size   个数   i++   ble   概率   close   div   str   href   

链接:

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4511

 

题意:

首先在手枪里随机装一些子弹,然后抠了一枪,发现没有子弹。
你希望下一枪也没有子弹,是应该直接再抠一枪(输出SHOOT)呢,还是随机转一下到任意位置再抠(输出ROTATE)?
如果两种策略下没有子弹的概率相等,输出EQUAL。
手枪里的子弹可以看成一个环形序列,开枪一次以后对准下一个位置。
例如,子弹序列为0011时,第一次开枪前一定在位置1或2(因为第一枪没有子弹),因此开枪之后位于位置2或3。
如果此时开枪,有一半的概率没有子弹。序列长度为2~100。

 

分析:

直接抠一枪没子弹的概率是一个条件概率,等于子串00的个数除以00和01总数(也就是0的个数)。
转一下到任意位置再抠没子弹的概率等于0的比率。
设子串00的个数为a,0的个数为b,则两个概率分别是a/b和b/n。问题就是比较a*n和b*b。
前者大就是SHOOT,后者大就是ROTATE,否则就是EQUAL。

 

代码:

 1 import java.io.*;
 2 import java.util.*;
 3 
 4 public class Main {
 5     static char s[] = new char[100+5];
 6     
 7     public static void main(String args[]) {
 8         Scanner cin = new Scanner(new BufferedInputStream(System.in));
 9         
10         while(cin.hasNext()) {
11             s = cin.nextLine().toCharArray();
12             int a = 0, b = 0, n = s.length;
13             for(int i = 0; i < n; i++) {
14                 if(s[i] == ‘1‘) continue;
15                 b++;
16                 if(s[(i+1)%n] == ‘0‘) a++;
17             }
18             if(a * n > b * b) System.out.println("SHOOT");
19             else if(a * n < b * b) System.out.println("ROTATE");
20             else System.out.println("EQUAL");
21         }
22         cin.close();
23     }
24 }

 

UVa 1636 - Headshot(概率)

标签:size   个数   i++   ble   概率   close   div   str   href   

原文地址:https://www.cnblogs.com/hkxy125/p/8921994.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!