太容易了 分成三组! A{a0,a1,a2,a3} B{b0,b1,b2,b3} C{c0,c1,c2,c3} if(A==B) { 令D' = {c0,c1,c2} if ( D' = = {a0,a1,a2} ) { c3 is bad ball; } else if( D' > {a0,a1,a2} ){ 令D" = {c0 ,a0}; 令D"" = {c1,a1}; if( D" = = D"" ){ c2 is bad ball; }else{ if( D" > D"" ) c0 is bad ball; else c1 is bad ball; } }else if( D' < {a0,a1,a2}) { 令D" = {c0 ,a0}; 令D"" = {c1,a1}; if( D" = = D"" ){ c2 is bad ball; }else{ if( D" > D"" ) c1 is bad ball; else c0 is bad ball; } } if(A > B){ 令 D' = {a0,a1,b2,c3}; ‘选球过程中还有a3,b3,b1没有选 令 D" = {b0,c1,a2,c0}; if( D' == D" ){ 取{a3,b3}和{c0,c1}比较 if( > ) a3 is bad ball if( < ) b3 is bad ball if( = ) b1 is bad ball }
if(D > D" ){ ‘假设坏球大,那么就在a0,a1当中;假设坏球小,那么就在b0中 坏球在a0,b0,a1之间 取{a0,b0}和{c0,c1}比较 ... if( > ) a0 is bad ball if( < ) b0 is bad ball if( = ) a1 is bad ball
} if(D'< D" ){ 取a2,b2任一,和标准c0比较 ‘假设坏球大,那么就在a2当中;假设坏球小,那么就在b2中 if a2>c0 a2 is bad ball else b2 is bad ball } } if(A < B){ 令 D' = {a0,a1,b2,c3}; ‘选球过程中还有a3,b3,b1没有选 令 D" = {b0,c1,a2,c0}; if( D' == D" ){ 取{a3,b3}和{c0,c1}比较 if( > ) b3 is bad ball if( < ) a3 is bad ball if( = ) b1 is bad ball }
if(D < D" ){ ‘假设坏球小,那么就在a0,a1当中;假设坏球大,那么就在b0中 坏球在a0,b0,a1之间 取{a0,b0}和{c0,c1}比较 ... if( > ) b0 is bad ball if( < ) a0 is bad ball if( = ) a1 is bad ball
} if(D'> D" ){ 取a2,b2任一,和标准c0比较 ‘假设坏球大,那么就在b2当中;假设坏球小,那么就在a2中 if a2>c0 b2 is bad ball else a2 is bad ball } }
zuguanqun(小群)的办法在次品比其余11个轻的时候有效,
tonyzhangcn(东尼) 的办法在次品比其余11个重的时候有效,
题目是不知轻重,所以都不对等待高手解答
将A分别与B和C比较,只要有一次不等就能确定是还是轻。这样单独对D中的3个进行称就可以找出来了。不过有个问题,如果A与B,C比较的结果都是相等的话,那么还得是4次才能解决。
第一次分为3堆,每堆四个。
一次称了以后可得有个不均匀的在其中的一堆,也就是在4个中的一个。//除非相等,你才知道在剩下的4个,不等的时候天知道在哪
分成4组每组3个怎么样?分别为A,B,C,D
将A分别与B和C比较,只要有一次不等就能确定是还是轻。这样单独对D中的3个进行称就可以找出来了。不过有个问题,如果A与B,C比较的结果都是相等的话,那么还得是4次才能解决。
------------------
这个也不可行。要4次或以上
1。IF A=B
2。IFA<>C C中就有一个重/轻了
3. C中的3个球分成2+1,再称,这次仍然不能找出哪个球重/轻了,还要一次.
2。IFA<>C C中就有一个重/轻了
3. C中的3个球分成1+1,再称,
这种情况下才能找到 目标球
说的很正确哟
44
22
11
12个球分成四堆,任意选两堆放上去(每堆三个)(1)保持平衡,说明,目标球在另外两堆里,不平衡,就在这两堆里
(2)找出问题的两堆,编号:123 , 456,没问题的球用*来表示, 如果 "1+5" 和 "4+2"继续撑,平衡, 则:问题球在3或6中,第三次 很容易分辨(* 与任意3,6比较)
如果不平衡,1。A,B盘倾斜次序保持不变,问题球在1,4中,如果倾斜次序相反,问题球在2,5中
(3)找出问题两球,比较既可正解问题最复杂的地方就在于123 与456 比较不同。这样可以分几种情况分别讨论
把123放在天平左边
情况A
天平倾向123一边
这种情况又有两种情况
情况a:123中有一个球比普通球重
再比较1+5,2+4
如果天平倾向左边,则1是较重的那个球(倾向和123一致)
否则天平倾向右边,则2是较重的那个球(倾向和123相反)
情况b:456中有一个球比普通球轻
再比较1+5,2+4
如果天平倾向左边,则4是较轻的那个球(倾向和123一致)
如果天平倾向右边,则5是较轻的那个球(倾向和123相反)
情况B(推理过程和情况A相似。)
所以倾向一致则1或4有问题。倾向不一致2或5有问题
A{a0,a1,a2,a3}
B{b0,b1,b2,b3}
C{c0,c1,c2,c3}
if(A==B)
{
令D' = {c0,c1,c2}
if ( D' = = {a0,a1,a2} ) {
c3 is bad ball;
} else if( D' > {a0,a1,a2} ){
令D" = {c0 ,a0};
令D"" = {c1,a1};
if( D" = = D"" ){
c2 is bad ball;
}else{
if( D" > D"" )
c0 is bad ball;
else
c1 is bad ball;
}
}else if( D' < {a0,a1,a2}) {
令D" = {c0 ,a0};
令D"" = {c1,a1};
if( D" = = D"" ){
c2 is bad ball;
}else{
if( D" > D"" )
c1 is bad ball;
else
c0 is bad ball;
}
} if(A > B){
令 D' = {a0,a1,b2,c3}; ‘选球过程中还有a3,b3,b1没有选
令 D" = {b0,c1,a2,c0};
if( D' == D" ){
取{a3,b3}和{c0,c1}比较
if( > )
a3 is bad ball
if( < )
b3 is bad ball
if( = )
b1 is bad ball
}
if(D > D" ){ ‘假设坏球大,那么就在a0,a1当中;假设坏球小,那么就在b0中
坏球在a0,b0,a1之间
取{a0,b0}和{c0,c1}比较
... if( > )
a0 is bad ball
if( < )
b0 is bad ball
if( = )
a1 is bad ball
}
if(D'< D" ){
取a2,b2任一,和标准c0比较 ‘假设坏球大,那么就在a2当中;假设坏球小,那么就在b2中
if a2>c0
a2 is bad ball
else
b2 is bad ball
}
}
if(A < B){
令 D' = {a0,a1,b2,c3}; ‘选球过程中还有a3,b3,b1没有选
令 D" = {b0,c1,a2,c0};
if( D' == D" ){
取{a3,b3}和{c0,c1}比较
if( > )
b3 is bad ball
if( < )
a3 is bad ball
if( = )
b1 is bad ball
}
if(D < D" ){ ‘假设坏球小,那么就在a0,a1当中;假设坏球大,那么就在b0中
坏球在a0,b0,a1之间
取{a0,b0}和{c0,c1}比较
... if( > )
b0 is bad ball
if( < )
a0 is bad ball
if( = )
a1 is bad ball
}
if(D'> D" ){
取a2,b2任一,和标准c0比较 ‘假设坏球大,那么就在b2当中;假设坏球小,那么就在a2中
if a2>c0
b2 is bad ball
else
a2 is bad ball
}
}
9个以下 三的二次方 2算出 3V3 1v1
27个以下 三的三次方 3算出 9V9 3V3 1v1
81个以下 三的四次方 4算出 27v27 9V9 3V3 1v1
.....
以下类推..12个的合理算法,分为9,3,0
在9中的话,2次可算出 (9再分3,3,3 )
在3中的话,1次可算出12个最多三次可算出结果
A:相等,从丙组取两个球比较
A1:相等,目标为丙组剩下的一个球
A2:不等,将天平右边盘子上的球换成其他任意一个球
A2a:相等,目标为刚才右边盘子上换下来的球
A2b:不等,目标为左边盘子上的球
B:不等,甲乙各留一个球在原来盘子上,再个取一个球交换盘子放,两两比较
B1:相等,甲乙没参与比较的两个球进入A2程序
B2:不等并且倾向方向不变,甲乙没交换的两个球进入A2程序
B3:不等并且倾向方向改变,甲乙交换的两个球进入A2程序
先把小球平均分成三组每组4个。
分别是 组一, A.B.C.D
组二, 1.2.3.4
组三, a.b.c.d
先用第一组和第二组称.平衡就不用说了(重或轻的球在组三中).
先假设.组一重.组二轻.
第一组和第二组不平衡.说明组一和组二中有一个球或重或轻.
再用A.B.1 和C.D.2去称(这后面就要用逻辑去想了) 平衡那是在3.4球不同.
不平衡.
1.平衡有没有出现交换.那么 A.B 中有一球重.或 2球 轻
2.平衡发生交换那么 C.D. 中有一球重.或 1 轻
再用A.2或C.1和a.b称.就可以推理出不同重量的球
①A和B称,如果相等证明不均匀的球在C组
②A和B称,如果不等证明不均匀的球在A组或B组,C组为标准重量第二次:
第一次中的①情况:A和C称,如果C重 证明不均匀球比较重
如果C轻 证明不均匀球比较轻
第一次中的②情况:A和C称,如果相等,证明B组有球不均匀,且根据1 ②的结果可以判断
出不均匀的球是重了,还是轻了
A和C称,如果不等,则A组有不均匀球,且根据跟C称的结果得知重了和还是轻了第三次:
第二次已经得出了不均匀小球的组,以及它是重了还是轻了, 任意取出2球相称,便可知结果
分成三组 A组 B组 C 各4个
顶第一次:
①A和B称,如果相等证明不均匀的球在C组
②A和B称,如果不等证明不均匀的球在A组或B组,C组为标准重量第二次:
第一次中的①情况:A和C称,如果C重 证明不均匀球比较重
如果C轻 证明不均匀球比较轻
第一次中的②情况:A和C称,如果相等,证明B组有球不均匀,且根据1 ②的结果可以判断
出不均匀的球是重了,还是轻了
A和C称,如果不等,则A组有不均匀球,且根据跟C称的结果得知重了和还是轻了第三次:
第二次已经得出了不均匀小球的组,以及它是重了还是轻了, 任意取出2球相称,便可知结果
第一步,让A与B放上天平
如果平衡就用(a1,a2,a3)与(c1,c2,c3)放到天平左右两边
如果再次平衡证明C4有问题,
用A4与C4比一下,就知道C4是重了还是轻了
如果(a1,a2,a3)与(c1,c2,c3)不平衡
则证明C4没有问题,且可以知道是轻了还是重了(因为A组是正常)
把C1和C2分别放在天平左右两边
如果平衡就C3重了或是轻了,
不能如果是重了那就是下沉的那个是问题球,轻了就上升的那个球是了
如果A与B不平衡(记住A是上升还上下沉)
把a1,a2,b1,c1放在左边,a3,a4,b2,c2放右边,如果平了,那就是B3,B4其中一个有误,下次直接把B3与B4放天平两边就知道了哪个球有问题
如果还是不平,则证明B3,B4正常
如果AB不平请参见ziqing_1_2_3(子清)的分析 ,否则再分D(1.2.3) E(9.10.11) F(12.13)如果DE不平则比较(9 10),(9 10)平则答案是11,如果9比10重且D比E重则答案是10,如果9比10重且D比E轻则答案是9.如果DE平则比较(1.12),平则答案是13,否则是12.
如果不平衡,如果A是下沉,则证明(a1,a2,a3,a4)中有一个重了,反之就是轻了
a1,a2,b1,c1与a3,a4,b2,c2哪边方向同A一样就证明问题球在此方,且可知是中的哪二个(a1,a2)与(a3,a4)再用,a1,a4与a2,a3就可以断定具体哪一个球有误
第一步,让A与B放上天平
如果平衡就用(a1,a2,a3)与(c1,c2,c3)放到天平左右两边
如果再次平衡证明C4有问题,
用A4与C4比一下,就知道C4是重了还是轻了
如果(a1,a2,a3)与(c1,c2,c3)不平衡
则证明C4没有问题,且可以知道是轻了还是重了(因为A组是正常)
把C1和C2分别放在天平左右两边
如果平衡就C3重了或是轻了,
不能如果是重了那就是下沉的那个是问题球,轻了就上升的那个球是了
如果A与B不平衡(记住A是上升还上下沉)
把a1,a2,b1,c1放在左边,a3,a4,b2,c2放右边,如果平了,那就是B3,B4其中一个有误,下次直接把B3与B4放天平两边就知道了哪个球有问题
如果还是不平,则证明B3,B4正常
再把a1,a4与a2,a3放入天平的两边,如果平了,就证明b1,b2有问题,又根据开始A组的状态以及a1,a2,b1,c1与a3,a4,b2,c2的结果可以推出,是b1,b2哪个球重了或轻了,
如果不平衡,如果A是下沉,则证明(a1,a2,a3,a4)中有一个重了,反之就是轻了
a1,a2,b1,c1与a3,a4,b2,c2哪边方向同A一样就证明问题球在此方,且可知是其中的哪二个(a1,a2)与(a3,a4)再用a1,a4与a2,a3就可以断定具体哪一个球有问题
有人已经给出答案啦,
如上:分3组(a,b,c),每组4个({a1,a2,a3,a4},{b1,b2,b3,b4},{c1,c2,c3,c4})
第一步,让A与B放上天平
如果平衡就用(a1,a2,a3)与(c1,c2,c3)放到天平左右两边
如果再次平衡证明C4有问题,
用A4与C4比一下,就知道C4是重了还是轻了
如果(a1,a2,a3)与(c1,c2,c3)不平衡
则证明C4没有问题,且可以知道是轻了还是重了(因为A组是正常)
把C1和C2分别放在天平左右两边
如果平衡就C3重了或是轻了,
不能如果是重了那就是下沉的那个是问题球,轻了就上升的那个球是了
如果A与B不平衡(记住A是上升还上下沉)
把a1,a2,b1,c1放在左边,a3,a4,b2,c2放右边,如果平了,那就是B3,B4其中一个有误,下次直接把B3与B4放天平两边就知道了哪个球有问题
如果还是不平,则证明B3,B4正常
再把a1,a4与a2,a3放入天平的两边,如果平了,就证明b1,b2有问题,又根据开始A组的状态以及a1,a2,b1,c1与a3,a4,b2,c2的结果可以推出,是b1,b2哪个球重了或轻了,
如果不平衡,如果A是下沉,则证明(a1,a2,a3,a4)中有一个重了,反之就是轻了
a1,a2,b1,c1与a3,a4,b2,c2哪边方向同A一样就证明问题球在此方,且可知是其中的哪二个(a1,a2)与(a3,a4)再用a1,a4与a2,a3就可以断定具体哪一个球有问题
楼上的,换种思路如何?
我自制了一个天平,带12个托盘,每个放一个球,哪个有问题,一次搞定。--------------------------
不知道是轻了还是重了,你一次怎么搞定
带12个指针嘛,11个球对天平压的指针刻度相同,第12个不同,不平衡的就是它了。
private int weight;
public void setWeight(int weight) {
this.weight = weight;
}
public int getWeight() {
return this.weight;
}
}class ComputerDifBall {
/**
* 天平称方法
* @param balls1
* @param balls2
* @return int 0:平,1:balls1重,2:balls2重
*/
public int balance(Ball[] balls1, Ball[] balls2) {
for (int i = 0; i < balls1.length; i++) {
int weight1 = balls1[i].getWeight();
int weight2 = balls2[i].getWeight();
if (weight1 > weight2) {
return 1;
} else if (weight1 < weight2) {
return 2;
}
}
return 0;
}
/**
* 天平称方法
* @param balls1
* @param balls2
* @return int 0:平,1:balls1重,2:balls2重
*/
public int balance (Ball ball1, Ball ball2) {
if (ball1.getWeight() == ball2.getWeight()) {
return 0;
} else if (ball1.getWeight() > ball2.getWeight()) {
return 1;
} else {
return 2;
}
}
/**
* 算出哪一个不一样,是重了还是轻了
* @param balls
* @return
*/
public void balanceMethod(Ball[] balls) {
Ball[] A = {balls[0],balls[1],balls[2],balls[3]};
Ball[] B = {balls[4],balls[5],balls[6],balls[7]};
Ball[] C = {balls[8],balls[9],balls[10],balls[11]};
//1.称第一次
int first = balance(A,B);
if (first == 0) {
//A==B,C组中有问题
Ball[]D = new Ball[3];
Ball[]E = new Ball[3];
for (int i = 0 ; i < 3; i++) {
D[i] = A[i];
E[i] = C[i];
}
//2.称第二次
int second = balance(D,E);
if (second == 0) {
//D,E相等,C中第4个有问题
//3.称第三次
int third = balance(A[0],C[3]);
System.out.println("第12个球有问题!"+(third==2?"这个球重了!":"这个球轻了!"));
} else {
//3.称第三次
int third = balance(C[0],C[1]);
if (third == 0) {
System.out.println("第11个球有问题!"+(third==2?"这个球重了!":"这个球轻了!"));
} else {
if (second == 1) {
if (third == 1) {
System.out.println("第10个球有问题!这个球轻了!");
} else {
System.out.println("第9个球有问题!这个球轻了!");
}
} else {
if (third == 1) {
System.out.println("第9个球有问题!这个球重了!");
} else {
System.out.println("第10个球有问题!这个球重了!");
}
}
}
}
} else {
Ball[] D = {A[0],A[1],B[0],C[0]};
Ball[] E = {A[2],A[3],B[1],C[1]};
//2.称第二次
int second = balance(D,E);
if (second == 0) {
//A和B不等,且A[0]+A[1]+B[0]+C[0] == A[2]+A[3]+B[1]+C[1]
//则肯定是B[2]/B[3]中有个球不一样
//3.称第三次
int third = balance(B[2],B[3]);
if (first == 1) {
if (third > 1 ) {
System.out.println("第7个球有问题!这个球轻了!");
} else {
System.out.println("第8个球有问题!这个球轻了!");
}
} else {
if (third > 1 ) {
System.out.println("第8个球有问题!这个球重了!");
} else {
System.out.println("第7个球有问题!这个球重了!");
}
}
} else {
Ball[] F = {A[0],A[3]};
Ball[] G = {A[1],A[2]};
//3.称第三次
int third = balance(F,G);
if (third == 0) {
//A中的球都是一样,B中有不相同的球
//B中B[0],B[1]不一样
if (first == 1) {
if (second == 1) {
System.out.println("第6个球有问题!这个球轻了!");
} else {
System.out.println("第5个球有问题!这个球轻了!");
}
} else {
if (second == 1) {
System.out.println("第5个球有问题!这个球重了!");
} else {
System.out.println("第6个球有问题!这个球重了!");
}
}
} else {
if (third == 1) {
//则A[0],A[1]中有一个重的球
if (first == 1) {
if (second == 1) {
System.out.println("第1个球有问题!这个球重了!");
} else {
System.out.println("第4个球有问题!这个球重了!");
}
} else {
if (second == 1) {
System.out.println("第3个球有问题!这个球轻了!");
} else {
System.out.println("第2个球有问题!这个球轻了!");
}
}
} else {
if (first == 1) {
if (second == 1) {
System.out.println("第2个球有问题!这个球重了!");
} else {
System.out.println("第3个球有问题!这个球重了!");
}
} else {
if (second == 1) {
System.out.println("第4个球有问题!这个球轻了!");
} else {
System.out.println("第1个球有问题!这个球轻了!");
}
}
}
}
}
}
}
public static void main(String[] args) {
ComputerDifBall cdb = new ComputerDifBall();
for (int i = 0; i < 12; i++) {
Ball[] ball = new Ball[12];
for (int j = 0; j < 12; j++) {
ball[j] = new Ball();
if (i != j)
ball[j].setWeight(0);
else
ball[j].setWeight(10);
}
System.out.println("-------------第"+i+"次测试,注意重的球为第"+(i+1)+"个!-----------------");
cdb.balanceMethod(ball);
System.out.println();
}
for (int i = 0; i < 12; i++) {
Ball[] ball = new Ball[12];
for (int j = 0; j < 12; j++) {
ball[j] = new Ball();
if (i != j)
ball[j].setWeight(10);
else
ball[j].setWeight(0);
}
System.out.println("-------------第"+i+"次测试,注意轻的球为第"+(i+1)+"个!-----------------");
cdb.balanceMethod(ball);
System.out.println();
}
}
}