1. 程式人生 > >hdu-6418 Rikka with Stone-Paper-Scissors(多校九1004)期望

hdu-6418 Rikka with Stone-Paper-Scissors(多校九1004)期望

題目連結:

題意:

Rikka和Yuta一起玩剪刀石頭布的遊戲,很有趣對不對~

Y分別有a1,b1,c1個剪刀,石頭,布,R分別有a2,b2,c2個剪刀,石頭,布,R勝Y得一分,平手得零分,R輸Y扣一分,求R得到最大分數的期望。

思路:

R要獲得最大分數,則在Y出剪刀的時候R一定要出石頭,此時R可以得到勝Y的分數但是同時會失去Y可能出布失去的分數

則A出剪刀時B得分的期望是:b2*a1/(a1+b1+c1) - b2*c1/(a1+b1+c1)

依次類推

所以B獲勝的期望是:(a1*b2-b2*c1+b1*c2-a1*c2+a2*c1-a2*b)/(a1+b1+c1)

AC程式碼如下:

#include<stdio.h>
#include<math.h>
long long GCD(long long  a,long long b)//求最大公約數
{   
	if(a<0)//注意可能為負的情況
	{
		a=-1*a;
	}
     if(0 == b)
        return a;
    else
        return GCD(b, a % b);
}
int main()
{
    int t;
	scanf("%d", &t);
    while(t--)
    {
        long long a1,b1,c1,a2,b2,c2,sum1,sum2,ss;
        scanf("%lld%lld%lld%lld%lld%lld",&a1,&b1,&c1,&a2,&b2,&c2);
        sum1=-a1*c2+a1*b2-b1*a2+b1*c2-c1*b2+c1*a2;
        sum2=a1+b1+c1;
        if(sum1 % sum2 != 0)
		{
			ss=GCD(sum1,sum2);
            sum1 /= ss;
            sum2 /= ss;
            printf("%lld/%lld\n",sum1,sum2);
        }
        else
            printf("%lld\n", sum1/sum2);
    }
 return 0;
}