以前听说过,但没仔细过这道题怎么解,昨天又听同学提起,想把答案找出来。虽然知道网上有答案。但是忍住没去看,我这人比较笨,想了两个多小时才想出来。今天把这种思路用程序写出来。毕竟用程序表达思想也是程序员的一种技能。呵呵。。
package test;
import java.io.*;
import java.util.HashMap;
public class Test {
public static void main(String args[])
{
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
map.put(1,10);
map.put(2,10);
map.put(3,10);
map.put(4,10);
map.put(5,10);
map.put(6,10);
map.put(7,10);
map.put(8,10);
map.put(9,12);
map.put(10,10);
map.put(11,10);
map.put(12,10);
System.out.println(find(map));
}
public static int find(HashMap<Integer,Integer> map)
{
//第一次查找,如果天平是平衡的。
if(map.get(1)+map.get(2)+map.get(3)+map.get(4)==map.get(5)+map.get(6)+map.get(7)+map.get(8))
{System.out.println("拿到天平上称一下。。");
//拿其中的3个好球和其它四个球中3个比较,得出平衡
if(map.get(1)+map.get(2)+map.get(3)==map.get(9)+map.get(10)+map.get(11))
{System.out.println("拿到天平上称一下。。");
return 12;
}
//如果好球重于坏球则9,10,11中有一个球是轻的
if(map.get(1)+map.get(2)+map.get(3)>map.get(9)+map.get(10)+map.get(11))
{System.out.println("拿到天平上称一下。。");
if(map.get(10)<map.get(11))
{System.out.println("拿到天平上称一下。。");
return 10;
}
if(map.get(11)>map.get(10))
{System.out.println("拿到天平上称一下。。");
return 11;
}
if(map.get(10)==map.get(11))
{System.out.println("拿到天平上称一下。。");
return 9;
}
}
//如果好球轻于坏球,则9,10,11中有一个坏球是重的
if(map.get(1)+map.get(2)+map.get(3)<map.get(9)+map.get(10)+map.get(11))
{System.out.println("拿到天平上称一下。。");
if(map.get(10)>map.get(11))
{System.out.println("拿到天平上称一下。。");
return 10;
}
if(map.get(11)<map.get(10))
{System.out.println("拿到天平上称一下。。");
return 11;
}
if(map.get(10)==map.get(11))
{System.out.println("拿到天平上称一下。。");
return 9;
}
}
}
//第一次查找,如果是1,2,3,4重于5,6,7,8
if(map.get(1)+map.get(2)+map.get(3)+map.get(4)>map.get(5)+map.get(6)+map.get(7)+map.get(8))
{System.out.println("拿到天平上称一下。。");
//如果把6,7,8移过来后小于另一边则6,7,8必有一球是坏球,而且较轻
if(map.get(1)+map.get(6)+map.get(7)+map.get(8)<map.get(5)+map.get(9)+map.get(10)+map.get(11))
{System.out.println("拿到天平上称一下。。");
if(map.get(6)<map.get(7))
{System.out.println("拿到天平上称一下。。");
return 6;
}
if(map.get(7)<map.get(6))
{System.out.println("拿到天平上称一下。。");
return 7;
}
if(map.get(7)==map.get(6))
{System.out.println("拿到天平上称一下。。");
return 8;
}
}
//如果把6,7,8移过来,大于另一边,则说明1,5球有一坏球,不知轻重
if(map.get(1)+map.get(6)+map.get(7)+map.get(8)>map.get(5)+map.get(9)+map.get(10)+map.get(11))
{System.out.println("拿到天平上称一下。。");
//如果1,5比好球重,则说明其中有一坏球是重的
if(map.get(1)+map.get(5)>map.get(9)+map.get(10))
{System.out.println("拿到天平上称一下。。");
return 1;
}
//如果1,5比好球轻,则说明其中有一坏球较轻
if(map.get(1)+map.get(5)<map.get(9)+map.get(10))
{System.out.println("拿到天平上称一下。。");
return 5;
}
}
//如果1,7,8,9等于5,9,10,11则说明坏球在换掉的2,3,4中,但2,3,4在第一次测试时重于左则,则说胆2,3,4中有一重球
if(map.get(2)>map.get(3))
{System.out.println("拿到天平上称一下。。");
return 2;
}
if(map.get(2)<map.get(3))
{System.out.println("拿到天平上称一下。。");
return 3;
}
if(map.get(2)==map.get(3))
{System.out.println("拿到天平上称一下。。");
return 4;
}
}
//第一次找球,1,2,3,4轻于4,5,6,7
if(map.get(1)+map.get(2)+map.get(3)+map.get(4)<map.get(5)+map.get(6)+map.get(7)+map.get(8))
{System.out.println("拿到天平上称一下。。");
//如果把2,3,4拿到另一边。还较轻,则2,3,4中必有一球是坏蛋,而且较轻
if(map.get(1)+map.get(9)+map.get(10)+map.get(11)>map.get(5)+map.get(2)+map.get(3)+map.get(4))
{System.out.println("拿到天平上称一下。。");
if(map.get(2)<map.get(3))
{System.out.println("拿到天平上称一下。。");
return 2;
}
if(map.get(2)>map.get(3))
{System.out.println("拿到天平上称一下。。");
return 3;
}
if(map.get(2)==map.get(3))
{System.out.println("拿到天平上称一下。。");
return 4;
}
}
//如果把2,3,4拿到另一边。较重,则1,5中必有一球是坏球,不知轻重
if(map.get(1)+map.get(9)+map.get(10)+map.get(11)<map.get(5)+map.get(2)+map.get(3)+map.get(4))
{System.out.println("拿到天平上称一下。。");
//如果1,5加起来比正常球轻,,
if(map.get(9)+map.get(10)>map.get(1)+map.get(5))
{System.out.println("拿到天平上称一下。。");
return 1;
}
//如果1,5加起来比正常球重
if(map.get(9)+map.get(10)<map.get(1)+map.get(5))
{System.out.println("拿到天平上称一下。。");
return 5;
}
}
//如果把2,3,4拿到另一边变平衡了,说明刚刚拿下去的,6,7,8有一球为坏球,第一称知道6,7,8这边较重
//说明6,7,8中有一坏球为重球
if(map.get(1)+map.get(9)+map.get(10)+map.get(11)==map.get(5)+map.get(2)+map.get(3)+map.get(4))
{System.out.println("拿到天平上称一下。。");
if(map.get(6)>map.get(7))
{System.out.println("拿到天平上称一下。。");
return 6;
}
if(map.get(6)<map.get(7))
{System.out.println("拿到天平上称一下。。");
return 7;
}
if(map.get(6)==map.get(7))
{System.out.println("拿到天平上称一下。。");
return 8;
}
}
}
return 1;
}
}
分享到:
相关推荐
问题的核心是通过有限次的天平称量,从一堆球中找出唯一的异常球(可能是轻的或重的),并确定其重量状态。这个问题有多种变形,但基本思路是通过每次称量获取尽可能多的信息,逐步缩小可能的范围。 首先,我们分析...
称球问题通常是指在一组看起来相同的球中,找出一个重量不同的球(轻球或重球),并确定其重量是比其他球轻还是重。这类问题通常涉及到逻辑推理和策略设计,以最小的称量次数找到答案。 问题的两个版本包括: 1. **...
标题“N枚硬币中找出假币”是一个经典的算法问题,通常称为“三权分立”或“找次品”的问题。在这个问题中,我们有N枚硬币,其中一枚是假币,假币可能比真币重也可能比真币轻,但其具体重量未知。目标是通过最少的...
问题:五桶球,一桶不正常,不知道球的重量和轻重关系,用天平称一次找出那桶不正常的球。 方法:使用天平称一次,即可找出那桶不正常的球。 7. 使用两个烧杯量出什么容积的水 问题:给两个烧杯,容积分别是 m 和...
9. **最优解法**:8个球的问题,可以先取4个球称一次,然后根据结果调整下一步操作,以确保在最少次数内找到轻球。 10. **未知方向的重量差**:5袋盐的问题,需要设计称量方案,确保无论轻重都能确定目标,可能需要...
3. **寻找未知轻重的饼干** - 题目要求:有3包饼干,其中两袋质量相同,另一袋不知是重还是轻。 - 解析:此题可以通过比较任意两包饼干来解决。取两包进行称重,如果两包重量相同,则第三包是目标饼干;如果两包...
2. **最优分组策略**:第二题提到从9件商品中找出1件次品,通常采用3份策略,即分成3份(3,3,3)进行称量,可以快速定位到次品所在的组别,然后进一步缩小范围。 3. **解决更大规模问题**:随着物品数量的增加,如...
这个问题旨在找到一组硬币中唯一一枚重量异常(轻重未知)的硬币,而我们拥有的工具可能仅限于一个天平秤。在给定的描述中,提到的解决方案是通过减制法实现的,并且在DEV C++环境中已经过测试并成功运行。 首先,...
9. 找不同质量糖果:用天平秤找轻重,最坏情况下需要称3次:第一次找出较轻的一组,第二次再找出较轻的一盒,第三次确认哪一盒是轻的。 10. 小正方体拼大正方体:要拼成大正方体,小正方体的数量必须是立方数,因此...
**延伸问题**:如何具体操作以确保能在三次内找出假币? 1. **第一次称量**:将12枚硬币分成三组,每组4枚。取两组进行第一次称量。 - 如果两边平衡,则假币在未称量的那一组中。 - 如果不平衡,则假币在较轻的...
这类问题通常通过二分法来解决,最少需要三次称量找出轻的那一盒饼干。 6. **平行四边形和三角形面积关系**:第8题中,平行四边形面积是80平方分米,如果与它等底等高,则三角形面积是平行四边形面积的一半,即40...
8. **找不同重量的糖果**:用天平找不同糖果,最坏情况需要比较3次(13/3=4...1,第一次4盒一组,找出较轻的1组;第二次1盒1盒称,确定哪盒较轻;第三次确定具体轻重)。 9. **折扣计算**:上衣原价120元,打八折,...
10. **逻辑推理**:在"看谁最聪明"的环节,学生需要从给定的三个数中选择合适的组合,形成正确的加减法算式,以及根据一系列的等式解出未知数,这锻炼了他们的逻辑推理和问题解决技巧。 总的来说,这份期中考试题旨...
孩子们需要理解等式的性质,通过代换和加减运算找出未知数的值。 这些练习题覆盖了小学一年级下学期数学的基本内容,包括数感、形状、比较、分类、加法、减法以及初步的代数思维。通过这样的练习,孩子们不仅可以...
9. **找不同质量物品**:用天平找轻重,最坏情况需要n次称量,n=lg2^(n+1),对于13盒糖果,需要3次即可找出轻的那一盒。 10. **比例计算**:汽车行驶100公里需8升油,那么1公里需0.08升油,1升油可行驶100/8=12.5...
- 天平找不同重量物体的最少次数:最坏情况下,每次比较可以排除一半的选项,找到轻重异常物体的最少次数可以用二进制表示法计算。 - 整数与小数的比较:不是所有整数都比小数大,比如1小于1.5。 - 能被2、3、5...
逻辑推理题目,如找出三个数相加等于10的组合,或者根据已知条件推断未知数的值,可以极大地提高孩子们的逻辑思维能力。这些题目通常需要孩子们先进行观察,然后进行推理和分析,最终得出结论。 规律和序列的题目...
六、找朋友:这个环节通过连线,让孩子找出加减法结果相同的一组算式,提升他们的计算和对应关系的能力。 七、数一数,涂一涂,圈一圈:测试孩子的观察能力和计数技巧,包括确定总数、找到特定位置的图形并涂色,...
学生被要求求出未知数的值以使等式成立,这需要他们运用逆向思维,从结果出发推算出缺失的数字。这不仅能够提高学生的计算技巧,还能够加强他们解决实际问题的策略。 随着难度的逐渐加深,例题四和练习四进一步加深...
这份资料是针对部编人教版三年级数学上册的一份期中考试试题及答案,适合学生进行期中复习和自我检测。试题包含了多个数学知识点,包括基础运算、几何概念、单位转换、问题解决等。 一、填空题部分涉及了乘法、长度...