《动物世界》的剪刀石头布 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代码为:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }
化繁为简 大巧不工