关于12个球的天平称法问题

kobefly 2004-12-31 10:42:27
最近一直有人在问12(13)个球有一个重量跟别的不同,然后只用天平称3次,找出来的问题,
正好女朋友面试也问到了这个问题,我就写了一个比较烂的程序是12个球的,关于13个的
其实差不多,因为5个球2次是可以称出来的(有8个好的球的前提下,因为过程中,你会一直用到正常球的),一起附上,想想去年的这个时候我还整天乐哉乐哉的,过了年开始找工作,才发现一直被鄙视,呵呵,知道四月底才找到工作,所以希望大家都能找到好的工作啊!!还有新年快乐,今天天很冷,昨天刚下乐大学,女朋友还去找工作,感觉很心疼的,希望她能早点找到工作,天天开心,也祝CSDN的所有朋友天天开心,工作顺利,还没有工作的,顺利找到工作.

下边是我写的一段代码:
大家帮我看看,抛砖引玉,共同学习
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
int IndexErr;//error number
int ball[12];//number of ball
int index;
int weight = 8;//deflaut weight of abnormal ball
int NorWeight = 5;//deflaut weight of abnormal ball
int result;

srand(time(NULL));
IndexErr = rand()%12;

printf("The abnormal number is %d\n", IndexErr);

for(index = 0; index < 12; index++)
{
ball[index] = NorWeight;
}
ball[IndexErr] = weight;

if((ball[0] + ball[1] + ball[2] + ball[3])
== (ball[4] + ball[5] + ball[6] + ball[7]))
{
if((ball[4] + ball[5] + ball[6]) > (ball[8] + ball[9] + ball[10]))
{
if(ball[8] < ball[9])
result = 8;
else if(ball[8] > ball[9])
result = 9;
else
result = 10;
}
else if((ball[4] + ball[5] + ball[6]) < (ball[8] + ball[9] + ball[10]))
{
if(ball[8] < ball[9])
result = 9;
else if(ball[8] > ball[9])
result = 8;
else
result = 10;
}
else
result = 11;
}
else if((ball[0] + ball[1] + ball[2] + ball[3])
< (ball[4] + ball[5] + ball[6] + ball[7]))
{
if((ball[0] + ball[1] + ball[2] + ball[4])
< (ball[3] + ball[9] + ball[10] + ball[11]))
{
if(ball[0] < ball[1])
result = 0;
else if(ball[0] > ball[1])
result = 1;
else
result = 2;
}
else if((ball[0] + ball[1] + ball[2] + ball[4])
> (ball[3] + ball[9] + ball[10] + ball[11]))
{
if(ball[0] == ball[3])
result = 4;
else
result = 3;
}
else
{
if(ball[5] < ball[6])
result = 6;
else if(ball[5] > ball[6])
result = 5;
else
result = 7;
}

}
else
{
if((ball[0] + ball[1] + ball[2] + ball[4])
> (ball[3] + ball[9] + ball[10] + ball[11]))
{
if(ball[0] < ball[1])
result = 1;
else if(ball[0] > ball[1])
result = 0;
else
result = 2;
}
else if((ball[0] + ball[1] + ball[2] + ball[4])
< (ball[3] + ball[9] + ball[10] + ball[11]))
{

if(ball[0] == ball[3])
result = 4;
else
result = 3;
}
else
{
if(ball[5] < ball[6])
result = 5;
else if(ball[5] > ball[6])
result = 6;
else
result = 7;
}

}
printf("The result is %d\n", result);

return 0;

}
另5个球2次问题

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
int ball[5];
int Index;
int ErrIndex;
int NorWeight = 5;
int ErrWeight = 3;
int result;

srand(time(NULL));
ErrIndex = rand()%5;

for(Index = 0; Index < 5; Index++)
{
ball[Index] = NorWeight;
}
ball[ErrIndex] =ErrWeight;

if((ball[0] + ball[1] + ball[2]) < (NorWeight * 3))
{
if(ball[0] < ball[1])
result = 0;
else if(ball[0] > ball[1])
result = 1;
else
result = 2;
}
else if((ball[0] + ball[1] + ball[2]) > (NorWeight * 3))
{
if(ball[0] < ball[1])
result = 1;
else if(ball[0] > ball[1])
result = 0;
else
result = 2;
}
else
{
if(ball[0] == ball[3])
result = 3;
else
result = 4;
}

return 0;
}
...全文
235 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
kobefly 2004-12-31
  • 打赏
  • 举报
回复
carylin(别信我,我在说谎) ( )
你怎么可以这么直接呢,偷偷以为就行了,嘿嘿

你也够狠
可我找不到你
不知道该怎么扁你
哈哈

欢迎拍砖,我也学习一下
playmud 2004-12-31
  • 打赏
  • 举报
回复
carylin(别信我,我在说谎) ( )
你怎么可以这么直接呢,偷偷以为就行了,嘿嘿
snow810211 2004-12-31
  • 打赏
  • 举报
回复
你们都是程序员吧!
我可不是,我只是想学学,好换工作:)

我收藏了,哈哈,至少我写不出来:)
avalonBBS 2004-12-31
  • 打赏
  • 举报
回复
楼主表要理他,把分给我,我把你扁,:o)
kobefly 2004-12-31
  • 打赏
  • 举报
回复
楼上的
你.......................................

真想揍你
你等着
carylin 2004-12-31
  • 打赏
  • 举报
回复
楼主,说实话,我不想打击你啊,作为一个程序员,写出这么烂的代码,咳……不说了!
dhfly 2004-12-31
  • 打赏
  • 举报
回复
这是我曾经做的:
题:有一批产品共12个小球,其中有一个次品(重量与其它11个不同),现有一天平,无砝码,无刻度,请用该天平在不超过三次称量中找出次品小球。
解:
先对该12个小球编号分组如下:
A 组: 1 2 3 4
B 组: 5 6 7 8
C 组: 9 10 11 12

第一次称:(A组和B组),分A组重,B组重,AB组一样重三种情况
1.1 A组重:
称 左:1 9 10 11 和 右:2 3 7 8 (第二次称)
2.1 左重:则次品在 1 7 8 中
称 左:7 和 右 8 (第三次称)
3.1 左重:次品为 8, (因为A组重,所以若次品在B组中必为轻)
3.2 右重:次品为 7
3.3 左右一样重:则次品为 1
2.2 右重:则次品在 2 3 中
称 左:2 和 右 9 (第三次称)
3.1左右不一样重:次品为 2
3.2 左右一样重:次品为 3
2.3 左右一样重:则次品在 4 5 6中
称 左:5 和 右 6 (第三次称)
3.1 左重:次品为 6 (因为A组重,所以若次品在B组中必为轻)
3.2 右重:次品为 5
3.3 左右一样重:次品为 4
1.2 B组重:(可用与A组相同方法判断出次品)
1.3 AB两组一样重:则次品在 C组 中。
称 左:9 和 右: 10 (第二次称)
2.1 左右一样重:则次品在 11 12中
称 左:9 和 右 11 (第三次称)
3.1 左右一样重:次品为 12
3.2 左右不一样重:次品为 11
2.2 左右不一样重:则次品在 9 10 中
称 左:9 和 右 11 (第三次称)
3.1 左右一样重:左右一样重:次品为 10
3.2 左右不一样重:次品为 9
kobefly 2004-12-31
  • 打赏
  • 举报
回复
avalonBBS( ̄(o o) ̄)

这个算法昨天有个帖子已经讲的很详细了
你可以参考一下

而且不止一种
我只是自己实现了一下

说起来可能比较难懂,结合着看一下好了
呵呵
Kshape 2004-12-31
  • 打赏
  • 举报
回复
我以前用delphi做过的
Kshape 2004-12-31
  • 打赏
  • 举报
回复
楼主写的不错!已经收藏!谢谢
avalonBBS 2004-12-31
  • 打赏
  • 举报
回复
科比还是描述算法就行了,源码看得伤眼睛啊 :o)
Kshape 2004-12-31
  • 打赏
  • 举报
回复
楼主写的不错!已经收藏!谢谢
avalonBBS 2004-12-31
  • 打赏
  • 举报
回复
板凳~~
kobefly 2004-12-31
  • 打赏
  • 举报
回复
占个沙发,哈哈
circleb 2004-12-31
  • 打赏
  • 举报
回复
是留原代码好呢还是留算法?留算法吧!
master5470 2004-12-31
  • 打赏
  • 举报
回复
hehe 过年大家蛮热闹啊
Michael_555 2004-12-31
  • 打赏
  • 举报
回复
又说谎了。
carylin 2004-12-31
  • 打赏
  • 举报
回复
没办法,我一向是直来直往的。
1.烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一个小时十五分钟呢? 2.你有一桶果冻,其中有黄色、绿色、红色三种,闭上眼睛抓取同种颜色的两个。抓取多少个就可以确定你肯定有两个同一颜色的果冻? 3.如果你有无穷多的水,一个3公升的提捅,一个5公升的提捅,两只提捅形状上下都不均匀,问你如何才能准确称出4公升的水? 4.一个岔路口分别通向诚实国和说谎国。来了两个人,已知一个是诚实国的,另一个是说谎国的。诚实国永远说实话,说谎国永远说谎话。现在你要去说谎国,但不知道应该走哪条路,需要问这两个人。请问应该怎么问? 5.12个球一个天平,现知道只有一个和其它的重量不同,问怎样称才能用三次就找到那个球。13个呢?(注意此题并未说明那个球的重量是轻是重,所以需要仔细考虑) 6.在9个点上画10条直线,要求每条直线上至少有三个点? 7.在一天的24小时之中,时钟的时针、分针和秒针完全重合在一起的时候有几次?都分别是什么时间?你怎样算出来的? 8.怎么样种植4棵树木,使其中任意两棵树的距离相等? 第一组题答案: 1)三根绳,第一根点燃两端,第二根点燃一端,第三根不点 第一根绳烧完(30分钟)后,点燃第二根绳的另一端,第二根绳烧完(45分钟)后,点燃第三根绳子两端,第三根绳烧完(1小时15分)后,计时完成 2)根据抽屉原理,4个 3)3升装满;3升-〉5升(全注入);3升装满;3升-〉5升(剩1升);5升倒掉;3升-〉5升(注入1升);3升装满;3升-〉5升;完成(另:可用回溯法编程求解) 4)问其中一人:另外一个人会说哪一条路是通往诚实国的?回答者所指的那条路必然是通往说谎国的。 5)12个球: 第一次:4,4 如果平了: 那么剩下的球中取3放左边,取3个好球放右边,称: 如果左边重,那么取两个球称一下,哪个重哪个是次品,平的话第三个重,是次品,轻的话同理 如果平了,那么剩下一个次品,还可根据需要称出次品比正品轻或者重 如果不平: 那么不妨设左边重右边轻,为了便于说明,将左边4颗称为重球,右边4颗称为轻球,剩下4颗称为好球 取重球2颗,轻球2颗放在左侧,右侧放3颗好球和一颗轻球 如果左边重 称那两颗重球,重的一个次品,平的话右边轻球次品 如果右边重 称左边两颗轻球,轻的一个次品 如果平 称剩下两颗重球,重的一个次品,平的话剩下那颗轻球次品 13个球: 第一次:4,4,如果平了 剩5颗球用上面的方法仍旧能找出次品,只是不能知道次品是重是轻 如果不平,同上 6) o o o o o o o o o 7) 23次,因为分针要转24圈,时针才能转1圈,而分针和时针重合两次之间的间隔显然>1小时,它们有23次重合机会,每次重合中秒针有一次重合机会,所以是23次 重合时间可以对照手表求出,也可列方程求出 8) 在地球表面种树,做一个地球内接的正四面体,内接点即为所求
基础篇 1、 算法有哪些特点?它有哪些特征?它和程序的主要区别是什么? 2、 算法的时间复杂度指的是什么?如何表示? 3、 算法的空间复杂度指的是什么?如何表示? 4、 什么是最坏时间复杂性?什么是最好时间复杂性? 5、 什么是递归算法?什么是递归函数? 6、 分治法的设计思想是什么? 7、 动态规划基本步骤是什么? 8、 回溯法与分枝限界法之间的相同点是什么?不同之处在哪些方面? 9、 分枝限界法的基本思想是什么? 10、 限界函数的功能是什么? 11、 设某一函数定义如下: 编写一个递归函数计算给定x的M(x)的值。 12、 已知一个顺序表中的元素按元素值非递减有序排列,编写一个函数删除表中多余的值相同的元素。 13、 分别写出求二叉树结点总数及叶子总数的算法。 分治术 14、 有金币15枚,已知其中有一枚是假的,而且它的重量比真币轻。要求用一个天平将假的金币找出来,试设计一种算法(方案),使在最坏情况下用天平的次数最少。 15、 利用分治策略,在n个不同元素中找出第k个最小元素。 16、 设有n个运动员要进行网球循环赛。设计一个满足以下要求的比赛日程表。 (1)每个选手必须与其它n-1选手各赛一次; (2)每个选手一天只能赛一次。 17、 已知序列{503,87,512,61,908,170,897,275,652,462},写一个自底向上的归并分类算法对该序列作升序排序,写出算法中每一次归并执行的结果。 贪心法 18、 设有n个文件f1,f2,…,fn要求存放在一个磁盘上,每个文件占磁盘上1个磁道。这n个文件的检索概率分别是p1,p2,…,pn,且 =1。磁头从当前磁道移到被检索信息磁道所需的时间可用这两个磁道之间的径向距离来度量。如果文件fi存放在第i道上,1≤i≤n则检索这n个文件的期望时间是 。其中d(i,j)是第i道与第j道之间的径向距离。磁盘文件的最优存储问题要求确定这n个文件在磁盘上的存储位置,使期望检索时间达到最小。试设计一个解此问题的算法,并分析算法的正确性与计算复杂性。 19、 设有n个正整数,编写一个算法将他们连接成一排,组成一个最大的多位整数。用贪心法求解本题。 20、 键盘输入一个高精度的正整数N(此整数中没有‘0’),去掉其中任意S个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数最小(输出应包括所去掉的数字的位置和组成的新的正整数,N不超过240位)。 21、 对于下图给出的有向网,写出用Dijkstra方法求从顶点A到图中其它顶点的最短路径的算法,并写出执行算法过程中顶点的求解次序及从顶点A到各顶点路径的长度。 22、 对于上图给出的有向图,写出最小成本生成树,给出求解算法。 动态规划 23、 求出上图中每对结点间的最短距离的算法,并给出计算结果。 24、 下图中给出了一个地图,地图中每个顶点代表一个城市,两个城市间的连线代表道路,连线上的数值代表道路的长度。现在,想从城市A到达城市E,怎样走路程最短,最短路程的长度是多少? 25、 已知序列a1,a2,…,an,试设计一算法,从中找出一子序列 ai1 < ai2 < … E。试用动态规划的最优化原理求出A->E的最省费用。 29、 已知如下图,写出用动态规划求最短路径的递推关系式,并写出求从源点A0到终点A3 的最短路径过程。给出求解算法。 6 A1 A2 5 5 2 A0 A3 3 4 4 B1 B2 5 搜索与遍历问题 30、 已知有向图G=,试设计一算法以判断对于任意两点u和v,是否存在一条从u到v的路径,并分析其复杂度。 31、 对于给定的一个二叉树T(如下图) a) 设计一个算法,统计二叉树中结点总数; b) 设计一个算法,求二叉树最大宽度及最大宽度所在深度。 32、 判近亲问题。给定一个家族族谱,为简化问题起见,假设家族中的夫妻关系只表示男性成员。设用线性表存储家族成员,用成员的父指针指向其生父。编写一个在此种族谱表示方式下的算法,判断给定的二个家族成员是否是五代内的近亲。(提示:家族成员的表示方式应与搜索方式相适应。) 33、 完全二叉树定义为:深度为K,具有N个结点的二叉树的每个结点都与深度为K的满二叉树中编号从1至N的结点一一对应。(1)写一个建立二叉树的算法。(2)写一个判别给定的二叉树是否是完全二叉树的算法。 34、 编写计算整个二叉树高度的算法(二叉树的高度也叫二叉树的深度)。 35、 编写计算二叉树最大宽度的算法(二叉树的最大宽度是指二叉树所有层中结点个数的最大值)。 回溯法 36、 (组合问题)求出从自然数1,2,…,n中任取r个数的所有组合。 37、 传教士与野人渡河问题。有M个传教士和M个野人准备渡河,船一次最多载2人,任何时刻野人数不能多于传教士数,但允许全部为野人。编写算法给出合理的渡河计划。 38、 某乡有n个村庄,有一个售货员,他要到各个村庄去售货,各村庄之间的路程s是已知的,且A村到B村与B村到A村的路大多不同。为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为1。试设计一个算法,帮他选择一条最短的路。 39、 设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设wi,j是从供应商j处购得的部件i的重量,ci,j是相应的价格。试设计一个算法,给出总价格不超过c的最小重量机器设计。 40、 设有n件工作分配给n个人。为第i个人分配工作j所需的费用为ci,j 。试设计一个算法,计算最佳工作分配方案,为每一个人都分配1 件不同的工作,并使总费用达到最小。 41、 编写程序求解骑士巡游问题:在n行n列的棋盘上(如n=8),假设一位骑士(按象棋中“马走日”的行走法)从初始坐标位置(x1,y1)出发,要遍访(巡游)棋盘中的每一个位置一次。请编一个程序,为骑士求解巡游“路线图”(或告诉骑士,从某位置出发时,无法遍访整个棋盘 — 问题无解骑士巡游)。
PTA_基础编程答案_整章 包括但不限于如下 7-1 厘米换算英尺英寸 15 27785 103313 0.27 7-2 然后是几点 15 20063 78572 0.26 7-3 逆序的三位数 10 24732 62644 0.39 7-4 BCD解密 10 14066 23357 0.60 7-5 表格输出 5 15169 36439 0.42 7-6 混合类型数据格式化输入 5 15719 36076 0.44 7-7 12-24小时制 15 14687 51855 0.28 7-8 超速判断 10 15328 39238 0.39 7-9 用天平找小球 10 15145 33252 0.46 7-10 计算工资 15 14241 35238 0.40 7-11 分段计算居民水费 10 12907 35261 0.37 7-12 两个数的简单计算器 10 12912 33359 0.39 7-13 日K蜡烛图 15 9280 34024 0.27 7-14 求整数段和 15 11461 55664 0.21 7-15 计算圆周率 15 9826 33135 0.30 7-16 求符合给定条件的整数集 15 8986 21898 0.41 7-17 爬动的蠕虫 15 9739 24881 0.39 7-18 二分法求多项式单根 20 7282 31752 0.23 7-19 支票面额 15 7375 21837 0.34 7-20 打印九九口诀表 15 10325 35138 0.29 7-21 求特殊方程的正整数解 15 7799 22600 0.35 7-22 龟兔赛跑 20 7446 29142 0.26 7-23 币值转换 20 4333 18467 0.23 7-24 约分最简分式 15 6728 15335 0.44 7-25 念数字 15 6724 20180 0.33 7-26 单词长度 15 5648 37409 0.15 7-27 冒泡法排序 20 7255 24045 0.30 7-28 猴子选大王 20 6144 13327 0.46 7-29 删除字符串中的子串 20 4798 15074 0.32 7-30 字符串的冒泡排序 20 4752 14741 0.32 7-31 字符串循环左移 20 4527 13605 0.33 7-32 说反话-加强版 20 4030 25470 0.16 7-33 有理数加法 15 4476 10862 0.41 7-34 通讯录的录入与显示 10 4323 19524 0.22 7-35 有理数均值 20 3281 17202 0.19 7-36 复数四则运算 15 2530 10103 0.25 7-37 整数分解为若干项之和 20 2437 4673 0.52 7-38 数列求和-加强版 20 4692 35190 0.13 当前显示1 - 38项,共38项

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧