UVA1636 决斗 Headshot(条件概率)
作者:互联网
题目传送门
这道题的题意其实就是,现在给你一把枪:第一枪为空炮,现在有俩操作
- 1:直接打一枪(每一次打一枪都会自动移动到下一位)
- 2:转一下再打一枪(转的位置再任何情况下每一位的概率是相同的)
请问我想要下一枪打空炮,(也就是让打空炮的概率最大),我应该怎么操作(我是应该选择1还是选择2呢)
选择转一下再开枪我的打空炮计算概率其实就是: 全 部 为 0 的 位 置 ( 没 有 子 弹 的 位 置 ) 总 位 置 ( 弹 夹 的 所 有 位 置 ) \frac{全部为0的位置(没有子弹的位置)}{总位置(弹夹的所有位置)} 总位置(弹夹的所有位置)全部为0的位置(没有子弹的位置)
直接打一枪的概率就是:
字 串 为 00 的 所 有 可 能 ( 注 意 考 虑 首 尾 , 因 为 是 环 嘛 ) 总 位 置 ( 弹 夹 的 所 有 位 置 ) 所 有 为 0 的 位 置 \frac{字串为00的所有可能(注意考虑首尾,因为是环嘛)}{总位置(弹夹的所有位置)所有为0的位置} 总位置(弹夹的所有位置)所有为0的位置字串为00的所有可能(注意考虑首尾,因为是环嘛)
本题可以交叉相乘来避免掉精度的问题
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
string s;
int main(){
while(cin>>s){
int a0=0,a00=0,n=s.size();
if(s[0]=='0')a0++;
for(int i=1;s[i];i++){
if(s[i]=='0'&&s[i-1]=='0')a00++;
if(s[i]=='0')a0++;
//else if(s[i]=='1'&&s[i-1]=='0')a01++;
}
if(s[n-1]=='0'&&s[0]=='0')a00++;
// cout<<a0*a0<<" "<<a00*n<<endl;
s.clear();
if(a0*a0>a00*n){
cout<<"ROTATE"<<endl;
}else if(a0*a0==a00*n){
cout<<"EQUAL"<<endl;
}else cout<<"SHOOT"<<endl;
}
}
标签:空炮,所有,UVA1636,++,位置,决斗,弹夹,一枪,Headshot 来源: https://blog.csdn.net/m0_51841071/article/details/116430855