《动物世界》的剪刀石头布 HDU --- 6418

题目连接:

https://vjudge.net/problem/1812686/origin

emmm 这一题的资料来自《动物世界》这一个李易峰演的电影。。

主要的思路就是概率,但是会牵扯到博弈论这一个复杂的思路,如果继续深入就会越陷越深。。。

为什么不需要博弈的根本原因是它的总数的不变的,这个需要考虑到

A: a1, b1, c1

B: a2, b2, c2

(其中a, b, c分别对应剪刀,石头,布)

现在要B赢,并且题目提到了B知道A中手牌

所以 A要赢的最佳可能是(a'*(c-b)+b'*(a-c)+c'*(b-a)) / (a+b+c).

然后对这个进行模拟运算,这里涉及到一个求最大公约数的函数gcd(), 然后变号等情况考虑一下

AC代码为:

#include <iostream>
#include <cstdio>
#define ll long long

using namespace std;

ll gcd(ll a, ll b)
{
    return a%b==0?b:gcd(b, a%b);
}

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        ll ans = 0;
        bool flag = false;
        ll a1, b1, c1;
        ll a2, b2, c2;
        scanf("%lld%lld%lld", &a1, &b1, &c1);
        scanf("%lld%lld%lld", &a2, &b2, &c2);
        ll fmu = a1+b1+c1;
        ll fzi = a2*(c1-b1)+b2*(a1-c1)+c2*(b1-a1);
        if(fmu == 1)
        {
            printf("%lld\n", fzi);
            continue;
        }
        if(fzi < 0)
        {
            fzi = -fzi;
            flag = true;
        }
        if(fzi == 0)
        {
            printf("0\n");
            continue;
        }
        if(fzi%fmu == 0)
        {
            ans = fzi/fmu;
            if(flag) printf("-%lld\n", ans);
            else printf("%lld\n", ans);
        }
        else
        {
            ll mxyin = gcd(fmu, fzi);
            fmu /= mxyin; fzi /= mxyin;
            if(flag) printf("-%lld/%lld\n", fzi, fmu);
            else printf("%lld/%lld\n", fzi, fmu);
        }
    }
    return 0;
}
View Code

 

posted @ 2019-01-18 16:44  mpeter  阅读(255)  评论(0编辑  收藏  举报