这道概率题很具有代表性,难度不高,无基础心细即可做。
【题意】
箱子里有1个红球和k个黑球,
两个人轮流不放回地从箱子里随机取出一个球,
当某人取到红球时获得胜利,游戏结束。
问先手是否获胜几率更大,
几率更大,输出”1”;
几率更小,输出”2”;
几率相等,输出”0”。
Tips:题目中,1≤k≤10^5,所以不考虑只有红球的情况(当然考虑进去推出的结论也适用)。
【提炼】
略。
【类型】
简单概率题(IIC类题)
【分析】
当k=1时,一个红球和一个黑球,先手获胜的概率P为
P(1+1)=12
当k=2时,一个红球和两个黑球,先手获胜的概率P为
P(2+1)=13+23⋅12=23
当k=3时,一个红球和三个黑球,先手获胜的概率P为
P(3+1)=14+34⋅23⋅12=12
当k=4时,一个红球和四个黑球,先手获胜的概率P为
P(4+1)=15+45⋅34⋅13+⋅45⋅34⋅23⋅12=35
故,先手获胜的概率P为
P(k+1)=1k+1+kk+1⋅k−1k⋅k−2k−1+…+⋅kk+1⋅k−1k⋅…⋅12=⌊k+22⌋k+1
所以,我们只需判断 ⌊k+22⌋ , k+1−⌊k+22⌋ 两者大小关系即可
【时间复杂度&&优化】
O(1)
数学推导式不需优化。
简化:
显然,这里可以简化判断式子:
奇数表示优势相同;
偶数表示先手占优。
【代码】
/*
coder: Tangent Chang
date: 2017/5/1
Your internal mediocrity is the moment when you lost the faith of being excellent!
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
using namespace std;
typedef long long ll;
const int maxn = 100001;
const double PI = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int EPS = -1e9;
const int MOD = 1000000007;
int main() {
int n;
while (~scanf("%d", &n)) {
if (n & 1) printf("0\n");
else printf("1\n");
}
return 0;
}