转自别处。
有十二个小球,有一个质量和其它十一个不一样,不知道是重还是轻。用一个天秤称三次,把这个质量不同的球给区别出来!!!
首先用小球的編號分三組!各组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比比!
首先用小球的編號分三組!各组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;
}
}
{
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放在天平两边称一下就知道了。
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
第一次 如果 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