//注意: 可能重投之后仍和原来一样 初始化:分母为1,概率为-1,个数为0 #include<iostream> #include<algorithm> #include<cmath> #include<cstring> using namespace std; const int N=40; int a[N],b[N]; //a为存储 b为翻转后的 int f[N],r[N]; //分母分子 int n; int getl(int s[]) //返回当下组合的等级 { sort(s+1,s+6); if(s[1]==s[2]&&s[2]==s[3]&&s[3]==s[4]&&s[4]==s[5]) //五个同点数 return 9; if(s[1]==s[2]&&s[2]==s[3]&&s[3]==s[4]||(s[2]==s[3]&&s[3]==s[4]&&s[4]==s[5]))//四个同点数 return 8; if(s[1]==s[2]&&s[2]!=s[3]&&s[3]==s[4]&&s[4]==s[5]||(s[1]==s[2]&&s[2]==s[3]&&s[3]!=s[4]&&s[4]==s[5]))//葫芦 return 7; if(s[1]==2&&s[2]==3&&s[3]==4&&s[4]==5&&s[5]==6)//六高 return 6; if(s[1]==1&&s[2]==2&&s[3]==3&&s[4]==4&&s[5]==5)//五高 return 5; if(s[1]==s[2]&&s[2]==s[3]||s[2]==s[3]&&s[3]==s[4]||s[3]==s[4]&&s[4]==s[5])//三个同点数 return 4; if(s[1]==s[2]&&s[3]==s[4]||s[1]==s[2]&&s[4]==s[5]||s[2]==s[3]&&s[4]==s[5])//两对 return 3; if(s[1]==s[2]||s[2]==s[3]||s[3]==s[4]||s[4]==s[5])//一对 return 2; return 1; } int gett(int x) //看看里面有几个1,就是有几个重投了 { int sum=0; while(x) { if(x%2==1) sum++; x/=2; } return sum; } int gcd(int x,int y) //化简分子分母 { return y?gcd(y,x%y):x; } int main(void) { cin>>n; while(n--) { memset(f,0,sizeof(f)); memset(r,0,sizeof(r)); for(int i=1;i<=5;i++) cin>>a[i]; int l1=getl(a); for(int i=1;i<=6;i++) for(int j=1;j<=6;j++) for(int k=1;k<=6;k++) for(int u=1;u<=6;u++) for(int o=1;o<=6;o++) { b[1]=i,b[2]=j,b[3]=k,b[4]=u,b[5]=o; //遍历 int ct=0; for(int i=1;i<=5;i++) if(a[i]!=b[i]) //将不一样的数标1,至少这些1是重投的 ct|=1<<(i-1); int l2=getl(b); for(int i=1;i<=31;i++) { if((i&ct)==ct) //ct里有的1,i里面都有,i里面多的1可能是也重投了,重投结果和原本的一样 { f[i]++; if(l2>l1) r[i]++; } } } int res=0,zi=0,mu=1; double bi=-1; for(int i=1;i<=31;i++) { if(r[i]==0)continue; int ge=gett(i); double gl=(double)r[i]/f[i]; if(gl>bi||(gl==bi&&ge<res)) { zi=r[i],mu=f[i]; res=ge; bi=gl; } } if(zi>0&&mu>0){ int chu=gcd(zi,mu); zi/=chu; mu/=chu;} cout<<res<<' '<<zi<<' '<<mu<<endl; } return 0; }
0.0分
0 人评分