`
javay
  • 浏览: 5889 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

12球,称3次找出不同的一个,未知轻重

F# 
阅读更多
以前听说过,但没仔细过这道题怎么解,昨天又听同学提起,想把答案找出来。虽然知道网上有答案。但是忍住没去看,我这人比较笨,想了两个多小时才想出来。今天把这种思路用程序写出来。毕竟用程序表达思想也是程序员的一种技能。呵呵。。
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
0
分享到:
评论
2 楼 yuyanshan 2009-03-20  
leonelwong 写道

其实这个题目很简单的,分两组 A:6个,B:6个 第一次 6个对6个 如果A重,抛弃B,否则就是B重,抛弃A 然后假设是A,分成两组,C:3个,D:3个 第二次 3个对3个 安装第一次的抛弃原则,假设是D比较重 D分三组,E:1个,F:1个,G:1个 第三次 E和F比 如果E和F中有一个重,那么就可以得出结论了,加入两个都一样重,很明显G是比较重的 排除法,30秒就OK
  
12球,称3次找出不同的一个,
未知轻重
1 楼 leonelwong 2009-03-20  
其实这个题目很简单的,分两组
A:6个,B:6个
第一次
6个对6个
如果A重,抛弃B,否则就是B重,抛弃A
然后假设是A,分成两组,C:3个,D:3个
第二次
3个对3个
安装第一次的抛弃原则,假设是D比较重
D分三组,E:1个,F:1个,G:1个
第三次
E和F比
如果E和F中有一个重,那么就可以得出结论了,加入两个都一样重,很明显G是比较重的
排除法,30秒就OK

相关推荐

    称球问题一般解法.docx

    问题的核心是通过有限次的天平称量,从一堆球中找出唯一的异常球(可能是轻的或重的),并确定其重量状态。这个问题有多种变形,但基本思路是通过每次称量获取尽可能多的信息,逐步缩小可能的范围。 首先,我们分析...

    两类_称球问题_的统一非序列解1

    称球问题通常是指在一组看起来相同的球中,找出一个重量不同的球(轻球或重球),并确定其重量是比其他球轻还是重。这类问题通常涉及到逻辑推理和策略设计,以最小的称量次数找到答案。 问题的两个版本包括: 1. **...

    N枚硬币中找出假币

    标题“N枚硬币中找出假币”是一个经典的算法问题,通常称为“三权分立”或“找次品”的问题。在这个问题中,我们有N枚硬币,其中一枚是假币,假币可能比真币重也可能比真币轻,但其具体重量未知。目标是通过最少的...

    常见算法笔试或面试题

    问题:五桶球,一桶不正常,不知道球的重量和轻重关系,用天平称一次找出那桶不正常的球。 方法:使用天平称一次,即可找出那桶不正常的球。 7. 使用两个烧杯量出什么容积的水 问题:给两个烧杯,容积分别是 m 和...

    五年级数学下册 第7单元数学广角测试卷(无答案) 新人教版 试题.doc

    9. **最优解法**:8个球的问题,可以先取4个球称一次,然后根据结果调整下一步操作,以确保在最少次数内找到轻球。 10. **未知方向的重量差**:5袋盐的问题,需要设计称量方案,确保无论轻重都能确定目标,可能需要...

    五年级数学广角测试题.docx

    3. **寻找未知轻重的饼干** - 题目要求:有3包饼干,其中两袋质量相同,另一袋不知是重还是轻。 - 解析:此题可以通过比较任意两包饼干来解决。取两包进行称重,如果两包重量相同,则第三包是目标饼干;如果两包...

    检测.docx

    2. **最优分组策略**:第二题提到从9件商品中找出1件次品,通常采用3份策略,即分成3份(3,3,3)进行称量,可以快速定位到次品所在的组别,然后进一步缩小范围。 3. **解决更大规模问题**:随着物品数量的增加,如...

    对N枚硬币中假币求解问题

    这个问题旨在找到一组硬币中唯一一枚重量异常(轻重未知)的硬币,而我们拥有的工具可能仅限于一个天平秤。在给定的描述中,提到的解决方案是通过减制法实现的,并且在DEV C++环境中已经过测试并成功运行。 首先,...

    人教部编版五年级数学上册期中考试题及答案【优质试卷】.pdf

    9. 找不同质量糖果:用天平秤找轻重,最坏情况下需要称3次:第一次找出较轻的一组,第二次再找出较轻的一盒,第三次确认哪一盒是轻的。 10. 小正方体拼大正方体:要拼成大正方体,小正方体的数量必须是立方数,因此...

    信息论与编码第二章课后习题答案

    **延伸问题**:如何具体操作以确保能在三次内找出假币? 1. **第一次称量**:将12枚硬币分成三组,每组4枚。取两组进行第一次称量。 - 如果两边平衡,则假币在未称量的那一组中。 - 如果不平衡,则假币在较轻的...

    新版部编人教版五年级数学上册期中考试题及答案免费.pdf

    这类问题通常通过二分法来解决,最少需要三次称量找出轻的那一盒饼干。 6. **平行四边形和三角形面积关系**:第8题中,平行四边形面积是80平方分米,如果与它等底等高,则三角形面积是平行四边形面积的一半,即40...

    部编人教版五年级数学上册期中考试题(真题).pdf

    8. **找不同重量的糖果**:用天平找不同糖果,最坏情况需要比较3次(13/3=4...1,第一次4盒一组,找出较轻的1组;第二次1盒1盒称,确定哪盒较轻;第三次确定具体轻重)。 9. **折扣计算**:上衣原价120元,打八折,...

    北师大版一年级上册数学期中考试题.doc

    2. 通过解方程找出未知数,如"○-3=7","○+△=14","△+□=6",这涉及到了简单的代数概念。 这些题目综合考察了一年级学生的基本数学技能,包括计数、比较、加减运算、数列规律以及简单的逻辑推理,是培养...

    【精品】小学数学下册一年级下册数学同步练习 (2).doc

    孩子们需要理解等式的性质,通过代换和加减运算找出未知数的值。 这些练习题覆盖了小学一年级下学期数学的基本内容,包括数感、形状、比较、分类、加法、减法以及初步的代数思维。通过这样的练习,孩子们不仅可以...

    小学五年级数学上册期中考试题(加答案).pdf

    9. **找不同质量物品**:用天平找轻重,最坏情况需要n次称量,n=lg2^(n+1),对于13盒糖果,需要3次即可找出轻的那一盒。 10. **比例计算**:汽车行驶100公里需8升油,那么1公里需0.08升油,1升油可行驶100/8=12.5...

    2022年苏教版五年级数学上册期中模拟考试【加答案】.pdf

    - 天平找不同重量物体的最少次数:最坏情况下,每次比较可以排除一半的选项,找到轻重异常物体的最少次数可以用二进制表示法计算。 - 整数与小数的比较:不是所有整数都比小数大,比如1小于1.5。 - 能被2、3、5...

    小学一年级上册数学123单元试卷精选.doc

    六、找朋友:这个环节通过连线,让孩子找出加减法结果相同的一组算式,提升他们的计算和对应关系的能力。 七、数一数,涂一涂,圈一圈:测试孩子的观察能力和计数技巧,包括确定总数、找到特定位置的图形并涂色,...

    部编人教版三年级数学上册期中考试题及答案【精美版】.pdf

    这份资料是针对部编人教版三年级数学上册的一份期中考试试题及答案,适合学生进行期中复习和自我检测。试题包含了多个数学知识点,包括基础运算、几何概念、单位转换、问题解决等。 一、填空题部分涉及了乘法、长度...

    咨询工具-7步解决问题

    【咨询工具-7步解决问题】是一种有效的问题解决方法,它被称为“七步成诗”,旨在帮助人们系统地处理复杂的问题,特别是在项目初期阶段,当面对挑战和未知时,这一方法显得尤为重要。以下是对这七个步骤的详细解释:...

Global site tag (gtag.js) - Google Analytics