【CQMTC2015#5】机器人 题解(博弈论)

         【题目描述】已知玩家 A 有 m 个机器人, 玩家 B 有 n 个机器人,他们每回合要选出若干个机器人进行对决。设某一回合 A 派出 t 个机器人, B 派出 s 个机器人,那么 A 获胜的概率是t/(t+s),B 获胜的概率是s/(t+s)。获胜的一方将缴获败方派出的机器人。现在假设 A 和 B 都采用最优策略,求玩家 A 最终获胜的概率u/v。

        【输入格式】一行,两个正整数 m, n

        【输出格式】一行, 两个互素的正整数 u, v

        【样例输入】 2 2

        【样例输出】 1 2

        【提示】 对于 30%的数据1<=m,n<=20。 对于 100%的数据1<=m,n<=10^9。

        

        博弈论问题,作者蒟蒻不会严谨证明,就只能说说自己的理解了.

        首先假设为1对1的情况,则每一方的期望值均为,$$1/2*1+1/2*(-1)=0$$.

        假设一方增加,则为1多对,1的一方期望值为,$$1/n*n+(n-1)/n*-1=1-(n-1)/n=1/n$$.

        另一方期望值为,$$n-1/n*n-1/n=n-1-(1/n)=n-(n+1/n)$$.

扫描二维码关注公众号,回复: 1926997 查看本文章

        减去数量得,$$(-n+1)/n$$和$$(-n-1)/n$$.

        可得增加数量,不会增加期望值,最佳策略即一个个的比.

        则最终胜率为m,与m+n的化简结果,求最大公约数化简即可.

        代码如下

#include<iomanip>
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
int m,n;
int gcd(int x,int y)
{
	if(y==0) return x;
	else return gcd(y,x%y);
}
int main()
{
	scanf("%d%d",&m,&n);
	int x=gcd(m,m+n);
	printf("%d %d",m/x,(m+n)/x);
}

猜你喜欢

转载自blog.csdn.net/dy_dream/article/details/79964244