UVa 1636 - Headshot(概率)
Posted Ctfes
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa 1636 - Headshot(概率)相关的知识,希望对你有一定的参考价值。
链接:
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(概率)的主要内容,如果未能解决你的问题,请参考以下文章