范沐垚


私信TA

用户名:dotcpp0614554

访问量:5204

签 名:

好大喜功

等  级
排  名 196
经  验 6613
参赛次数 0
文章发表 87
年  龄 18
在职情况 学生
学  校 看今夜 小楼灯宴
专  业 尽是良辰美眷

  自我简介:

沽名钓誉

//注意: 可能重投之后仍和原来一样  初始化:分母为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 人评分

  评论区

  • «
  • »