有一个人想在机器上赌博。他有点愚蠢,所以他想赔钱,不会在机器上玩,除非从长远来看会让他赔钱。有三个变量,N(1到100之间的值) - 如果他赢了就赢得的金额,K(1到100之间的值) - 它花费的金额和p(两者之间的浮动值) 0和1) - 获胜的概率。这是我正在使用的代码:
int n;
int k;
float p;
cin >> n >> k >> p;
if( k-n > 0 )
{
cout << "Play";
}
if( k-n == 0 )
{
if( p == 1 )
{
cout << "Don't Play!";
}
else
{
cout << "Play";
}
}
if( k-n < 0 )
{
if( p >= ((float)k/n) )
{
cout << "Don't Play!";
}
else
{
cout << "Play";
}
}
代码首先将值添加到变量中。然后检查k是否大于n。如果是,那么他当然应该参加比赛。如果它的成本高于他能赢的成本,那么他总会输给机器。
之后检查k = n。如果确实如此,那么只有在没有100%胜率的情况下他才能参加比赛,因此他最终会赔钱,否则他将一直保持相同数额的金钱。
最后,它检查k是否小于n,这就是我认为问题所在。如果n较大,那么它取决于p的值。如果p大于k / n那么就不应该播放。示例:k = 3且n = 4。3/4 = 0.75。如果p = 0.75,那么从理论上讲,这个家伙将赢得三次中的三次。他将赢得胜利的时间,他将花费9并赢得12,这意味着他已经剩3分。然后他将失去一个然后回到0.因此,如果p> = k / n,则不应该玩,因为从理论上讲,你不会失去任何金钱。但除此之外,如果它低于k / n,那就好了,你会赔钱。
当我在网站上编译此代码时,它会检查8个秘密测试值。此代码完成前四个但在第五个上失败。有些事情一定是错的。但是,我不能发现它是什么。
答案 0 :(得分:0)
您应该阅读有关概率的内容。
p&gt; =((float)k / n)
应该写成
p *(n-k)+(1-p)*(0-k)> 0
编辑:
对不起,我搞错了。我认为它更干净一点,你不会得到0的div。但事实上它们应该是相同的。
也许你应该让p加倍,然后你就不会因为舍入问题而出错。