|
发表于 2024-4-10 07:08:58
|
显示全部楼层
众所周知
平均数只能是5.5
所以问题可以改成,有多少种分法使得平均数等于5.5
然后分两种情况
1、{1,10}{2,9}{3,8}{4,7}{5,6}这五个集合与每一组的交要不然是本身要不然是空集
2、其他情况
于是……
除去{1,10}{2,9}{3,8}{4,7}{5,6}这样的分组之后,剩下的分法,至多有4个组
4^10<2^32,这已经是计算机可以暴搜的范畴了- #include<stdio.h>#define testmean(x) (count[x]==0||(val[x]<<1)/count[x]==11)int main(){ char q,w,e,r,t,y,u,i,o,p; char val[4],count[4]; int right[4]; val[0]=val[1]=val[2]=val[3]=count[0]=count[1]=count[2]=count[3]=right[0]=right[1]=right[2]=right[3]=0; for(q=0;q<1;q++){ val[q]+=1;count[q]+=1; for(w=0;w<4;w++){ val[w]+=2;count[w]+=1; for(e=0;e<4;e++){ val[e]+=3;count[e]+=1; for(r=0;r<4;r++){ val[r]+=4;count[r]+=1; for(t=0;t<4;t++){ val[t]+=5;count[t]+=1; for(y=0;y<4;y++){ val[y]+=6;count[y]+=1; for(u=0;u<4;u++){ val[u]+=7;count[u]+=1; for(i=0;i<4;i++){ val[i]+=8;count[i]+=1; for(o=0;o<4;o++){ val[o]+=9;count[o]+=1; for(p=0;p<4;p++){ val[p]+=10;count[p]+=1; if(testmean(0)&&testmean(1)&&testmean(2)&&testmean(3)){ right[(0!=count[1])+(0!=count[2])+(0!=count[3])]++; } val[p]-=10;count[p]-=1; } val[o]-=9;count[o]-=1; } val[i]-=8;count[i]-=1; } val[u]-=7;count[u]-=1; } val[y]-=6;count[y]-=1; } val[t]-=5;count[t]-=1; } val[r]-=4;count[r]-=1; } val[e]-=3;count[e]-=1; } val[w]-=2;count[w]-=1; } val[q]-=1;count[q]-=1; } return printf("%d %d %d %d %d",right[0],right[1],right[2],right[3],right[0]+right[1]+(right[2]>>1)+right[3]/6+1);}
复制代码- time ./math1 69 174 60 168real 0m0.024suser 0m0.016ssys 0m0.016s
复制代码 如果没算错应该一共168种情况,分别对应
都属于第一组(1种)
属于两个组,1在1组(69种)
属于3个组,1在1组,交换2,3组视为不同的结果(174种)
属于4个组,1在1组,交换2,3,4组视为不同的结果(60种)
属于5个组,只能是{1,10}{2,9}{3,8}{4,7}{5,6}
去除重复(交换)之后共计168种 |
|