hdu 6418(石头剪刀布 **)

题意是说双方各有剪刀,石头和布的卡片各 a,b,c,a‘,b',c' 张,对方是随机选择,问我方的最大预期得分。

这道题目一开始看到的时候感觉没有头绪,再次读题,发现题目说结果可能是分数,如果是分数的话就输出最简分数......

这时候突然感到奇怪,为什么会有分数呢?加之题目中说到的对方是随机选择,会不会是每种卡片的出现概率?用唯一出现的一组结果是分数的样例,发现分母可以整除卡片数目和,那么分母就很可能是卡片数目和。从这一点来(继续)猜测,得到样例 2 0 0,0 2 0;1 1 1,1 1 1;1 0 0,0 0 1;123 456 789,100 200 1068 的结果的分母应该分别是 2,3,1,1368,再由样例给出的结果,分子应该分别是 4,0,-1,255744,再由给出的样例,应该结果是卡片出现的概率作了 pa--pb', pb--pc',pc--pa',pa'--pb,pb'--pc,pc'--pa 这样几组乘积,然后将胜利的总和减去失败的总和。还要注意的是分子可能是负数,本人就直接求了分子和分母的最大公因数,然后分别去除以最大公因数,导致分母变成了负数,要多加一步判断负数的符号只能出现在分子上。这里基本没有逻辑的分析,完全是胡乱猜测,还是等其他的高人的真*分析吧。(a了这题感觉又折损了不少运气.......)

代码如下:

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <algorithm>
 4 using namespace std;
 5 __int64 ans,sum;
 6 __int64 gcd(__int64 a,__int64 b)
 7 {
 8     if(b==0)return a;
 9     return gcd(b,a%b);
10 }
11 void fin()
12 {
13     __int64 s = gcd(ans,sum);
14     ans/=s;
15     sum/=s;
16     if(sum<0) {sum*=-1; ans*=-1;}
17     printf("%I64d/%I64d\n",ans,sum);
18 
19 }
20 int main()
21 {
22     int t;
23     __int64 a,b,c,aa,bb,cc;
24     scanf("%d",&t);
25     while(t--)
26     {
27         scanf("%I64d%I64d%I64d%I64d%I64d%I64d",&a,&b,&c,&aa,&bb,&cc);
28         sum = a+b+c;
29         if(sum == 0)
30         {
31             puts("0");
32             continue;
33         }
34         ans = (aa*c+bb*a+cc*b-aa*b-bb*c-cc*a);
35         if(ans%sum==0)
36         {
37             ans/=sum;
38             printf("%I64d\n",ans);
39         }
40         else fin();
41     }
42     return 0;
43 }
View Code

猜你喜欢

转载自www.cnblogs.com/Taskr212/p/9507725.html