- 注册时间
- 2017-12-7
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 3243
- 在线时间
- 小时
|
发表于 2019-10-8 00:38:48
|
显示全部楼层
众所周知
平均数只能是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 ./math
- 1 69 174 60 168
- real 0m0.024s
- user 0m0.016s
- sys 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种 |
|