球体重量测试

转自别处。
有十二个小球,有一个质量和其它十一个不一样,不知道是重还是轻。用一个天秤称三次,把这个质量不同的球给区别出来!!!
首先用小球的編號分三組!各组4個!第一組是1,2,3,4;第二組是5,6,7,8;第三組是9,10,11,12;
第一步用1,2,3,4跟5,6,7,8比!
1.如果一样的話表示1到8都是正常的!跟着用(随便3個)1,2,3跟9,10,11比!看看右边的是重还是轻!然后在9,10,11其中抽兩個出来比!馬上得到結果!如果1,2,3跟9,10,11是一樣重量的話隨便拿一個小球跟12比比!就知道12是重還是輕!
2.如果不一樣就表示9,10,11,12都是正常!那肯定會出现一边重一边輕!因為我們不知道"有问题"的小球是重还是~那麼首先假设"左重右轻"!跟着用1,2,5跟3,4,6比!這裏又有一個分支~1.如果還是左邊重的話就說明1,2重~或者是6輕!跟着1和2比!誰重誰就有問題!一樣的話就是6輕!
2.相反!如果是左輕右重的話~就說明3,4重或者是5輕!用同樣方法!3和4比比!
答案就是這樣!不明白的最好實踐一下!裏麵的假設是隨便的~妳可以假設為"左輕右重"~后麵的想法都是一樣的~把"重輕"兩字互換一下!
public class bottle
{
 public static void main( String[] args )
 {
  int result=0,result1=0,result2=0,result3=0;
  int [] bottle_12 = {12,12,12,12,12,12,12,12,10,12,12,12 };
  int [] groupA = {0,1,2,3};
  int [] groupB = {4,5,6,7};
  result1 = compare(bottle_12, groupA,groupB );
  if    (result1 < 0) { fill(groupA,1,5,9,10);fill(groupB,6,7,2,10);}
  else if(result1 > 0) { fill(groupA,6,7,2,10);fill(groupB,1,5,9,10);}
  else if(result1 ==0) { fill(groupA,9,10,1,1);fill(groupB,1,2,1,1 );}
  
  result2 = compare( bottle_12,groupA , groupB );
  if ( result1 < 0 )
  {
   if ( result2 < 0 ){fill(groupA,6,9,9,9);fill(groupB,7,9,9,9);}
   if ( result2 ==0 ){fill(groupA,3,1,1,1);fill(groupB,4,1,1,1);}
   if ( result2 > 0 ){fill(groupA,2,1,1,1);fill(groupB,9,1,1,1);}
  }
  else if ( result1 == 0 )
  {
   if ( result2 < 0 ){fill(groupA,9,1,1,1);fill(groupB,10,1,1,1);}
   if ( result2 ==0 ){fill(groupA,11,1,1,1);fill(groupB,1,1,1,1);}
   if ( result2 > 0 ){fill(groupA,10,1,1,1);fill(groupB,9,1,1,1);}
  }
  else if ( result1 > 0 )
  {
   if ( result2 < 0 ){fill(groupA,7,9,9,9);fill(groupB,6,9,9,9);}
   if ( result2 ==0 ){fill(groupA,4,9,9,9);fill(groupB,3,9,9,9);}
   if ( result2 > 0 ){fill(groupA,2,9,9,9);fill(groupB,9,9,9,9);}
  }
  
  result3 = compare(bottle_12,groupA, groupB);
  if ( ( result1 == 0) && ( result2 == 0 ) )
  {
   if (result3 == 0 ) result = 12;
   else result = 11;
  }
  if ( ( result1 == 0) && ( result2 != 0 ) )
  {
   if (result3 == 0 ) result = 100;
   else if (result3 < 0) result = 9;
   else if ( result3 >  0)result = 10;
  }
  if(result1 != 0 )
  {
   if (result2 < 0 )
   {
    if (result3 < 0) result = 7;
    else if (result3 == 0 ) result = 1;
    else if ( result3 < 0 ) result = 6;
    
   }
   else if (result2 == 0 )
   {
    if (result3 < 0) result = 3;
    else if (result3 == 0 ) result = 8;
    else if ( result3 < 0 ) result = 4;
   }
   else if (result2 > 0 )
   {
    if (result3 < 0) result = 2;
    else if (result3 == 0 ) result = 5;
    else if ( result3 < 0 ) result = 100;
   }
  }
                System.out.println(" "+ result1+"##"+result2+"##"+result3+"##"+result);
 }
 //
 public static int compare ( int [] bo, int [] ga, int [] gb )
 {
  int a=0,b=0,r=0;
  for( int index = 0;index < 4 ; index ++ )
  {
   a += bo [ ga[index] ];
   b += bo [ gb[index] ];
  }
  if ( a > b ) r= -1;
  else if ( a == b )r= 0;
  else if ( a < b ) r= 1;
                return r;
 }
 //
 
 public static void fill( int [] g,int a,int b ,int c ,int d)
 {
  g[0]=a-1;
  g[1]=b-1;
  g[2]=c-1;
  g[3]=d-1;
 }
}
 
倒推回去就明白了。 。
最后一步 还不是 称出假的那个
这个和 什么什么寺庙的和尚叠什么圆问题很象??
要分成3组、每组4个来称才行
1.取两组分别放在天平两边,如果平衡接下来就好做了;如果不平衡,假设轻的一边的标为p,重的一边的标为q。
2.取2个p一个q放在天平左边,2个p一个q放在天平右边,这时会有一个轻重关系。如果平衡则好办;如果左边重,则左边的2个p和右边的q都不可能是坏球;如果右边重,则左边的q和右边的2个p都不可能是坏球。
3.对于上面两种不平衡的情况,都容易办,取2个p放在天平两边称一下就知道了。
 
分三组:1234  5678  9ABC
第一次 如果 1234 = 5678, 则9ABC用两次,配合1234,5678中的标准球,肯定能出来。
第一次 如果 1234 > 5678  则9ABC都是标准的
第二次 5239和1ABC,
 1 如果 5234 = 1ABC
   说明678有问题,因为之前1234 > 5678,所以结果球比标准球轻,
   第三次 称 6和7,如果想等则结果是8,如果6〉7则为7,如果6<7则为6,END
 2 如果 5234 〉1ABC
   说明234有问题,而且结果球比标准球重
   第三次 称 2和3,如果想等则结果是4,如果2〉3则为2,如果2<3则为3,END
 3 如果 5234〈1ABC
   说明1跟5有问题,因为ABC是标准球,只有1跟5互换导致天平反向
   第三次 称1跟A,相对则为5(比标准球轻),不等则为1(比标准球重)END
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值