http://acm.hdu.edu.cn/contests/contest_showproblem.php?cid=638&pid=1003
4 2 3 5 3 3 4 3 3 1 2 2 2 6 2 1 5 4 3 1 2 3 4 4 1
0.333 0.167 1.000 0.000
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> #include <cstdlib> #include <limits> #include <queue> #include <stack> #include <vector> #include <map> using namespace std; typedef long long LL; #define N 1100 #define INF 0x3f3f3f3f #define PI acos (-1.0) #define EPS 1e-8 #define met(a, b) memset (a, b, sizeof (a)) int A[5], B[5]; int judge (int C[]) { if (C[0]==C[1] && C[1]==C[2] && C[0]==C[1]) return 3;///条子 if (C[0]==C[1] || C[1]==C[2]) return 2;///对子 if (C[0]!=C[1] && C[1]!=C[2] && C[0]!=C[2]) return 1;///散牌 } void fuzhi (int a[], int b[]) { for (int i=0; i<3; i++) a[i] = b[i]; } bool compare (int a[], int b[]) { int A[10], B[10]; fuzhi (A, a), fuzhi (B, b); sort (A, A+3), sort (B, B+3); int AT = judge (A), BT = judge (B);///三张牌的类型 if (AT>BT) return true;///当A的类型大于B的时候,不需要再投掷即是A胜 if (AT<BT) return false; if (AT==3 && BT==3) return A[0]>B[0];///A和B都是条子的情况 if (AT==2 && BT==2)///A和B都是对子的情况 { if (A[1] > B[1]) return true; if (A[1] < B[1]) return false; int AK, BK; if (A[0]!=A[1]) AK = A[0]; else AK = A[2]; if (B[0]!=B[1]) BK = B[0]; else BK = B[2]; return AK > BK; } if (AT==1 && BT==1)///A和B都是散牌的情况 { if (A[2]>B[2]) return true; if (A[2]<B[2]) return false; if (A[1]>B[1]) return true; if (A[1]<B[1]) return false; return A[0]>B[0]; } } int main () { int t; scanf ("%d", &t); while (t--) { scanf ("%d %d %d %d %d %d", &A[0], &A[1], &A[2], &B[0], &B[1], &B[2]); if (compare (A, B)) puts ("1.000"); else { int c[4], maxn = 0; for (int i=0; i<3; i++) { fuzhi (c, A);///将A数组保存到C数组中,防止A发生变化,影响下一次判断 int cnt = 0; for (int j=1; j<=6; j++) { c[i] = j;///一一改变这三个筛子的值 if (compare (c, B)) cnt++; } maxn = max (maxn, cnt);///保存获胜的最大概率 } printf ("%.3f\n", maxn*1.0/6); } } return 0; }