题意是说双方各有剪刀,石头和布的卡片各 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 ",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 ",ans); 39 } 40 else fin(); 41 } 42 return 0; 43 }