问题描述:

在n枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重。可以通过一架天平来任意比较两组硬币,设计一个高效的算法来检测这枚假币。

解题思路:

    使用减治法的解题思路,将硬币分为3堆,则每堆的硬币数量为 n/3 ,但是这是在 n%3==0 的情况下才能成立,所以我们将 n 枚硬币分为 3 堆加 1 堆 余数堆(余数堆可能为0),则可分为如下(n-n%3)/3,  (n-n%3)/3,  (n-n%3)/3,    n%3.

如下图:

(n-n%3)/3
(n-n%3)/3
(n-n%3)/3
n%3
a
b
c
d
  1. 首先获取真币,通过从数组中随机取三枚硬币,互相比较,相等的两枚为真币,任意取一枚作为真币 记录 数组下标。
  2. 判断n中的硬币数量,如果n>2则执行3,否则执行5.
  3. 将n分为上图的四堆,拿 a 和 b 比较,如果 a == b ,则 假币在 c 或 d 中。否则假币在 a 或 b 中。
  4. 如果 a == b,则拿 a 和 c 比较。如果 a == c,则假币在d中。将 d 再次 执行本流程。如果不等,则假币在 c 中,将 d (余数堆) 再次 执行流程,并且n=n%3,。
  5. 如果 a != b,则拿 a 和 c 比较。如果 a == c,则假币在b中。将 b 再次 执行本流程。如果不等,则假币在 a 中,将 a 再次 执行流程  2,并且n=(n-n%3)/3。
  6. 如果n==2,则将两枚硬币与真的硬币(通过 数组下标 )进行比较,不同的为假币,输出结果,结束。
  7. 如果n==1,则该硬币就是假币,输出结果结束。

  *注:按照2-5流程分堆下去,在最后一执行流程 2 时,n中含有假币,并且n只可能为1或2.(初始时,n>3,若n<3,则不能判断真假)

主要代码如下:

 //计算硬币总重量
int sum_coin(int coin[],int m,int n){
int result=;
if(m>n)
return ;
for(int i=m;i<=n;i++){
result+=coin[i];
} return result;
}; //找出假币 m , n 数组下标,coin 硬币数组,relCoin 真币数组下标
int check_coin(int coin[],int m,int n,int& relCoin){ int vary=n-m+; int restCoin=vary%;
int vary2=vary-restCoin; if(vary==)
return m; if(vary==)
{
if(sum_coin(coin,m,m)==sum_coin(coin,relCoin,relCoin))
return n;
else
return m; } if(sum_coin(coin,m,m+vary2/-)==sum_coin(coin,m+vary2/,m+(vary2/)*-))//第一堆 == 第二堆
{
if( (sum_coin(coin,m,m+vary2/-)==sum_coin(coin,m+(vary2/)*,m+vary2-)))//第一堆 == 第三堆
check_coin(coin,n-restCoin+,n,relCoin);
else//第一堆 != 第三堆
check_coin(coin,m+(vary2/)*,m+vary2-,relCoin);
}
else//第一堆 != 第二堆
{
if(sum_coin(coin,m,m+vary2/-)==sum_coin(coin,m+(vary2/)*,m+vary2-))//第一堆 == 第三堆
check_coin(coin,m+vary2/,m+(vary2/)*-,relCoin);
else//第一堆 != 第三堆
check_coin(coin,m,m+vary2/-,relCoin);
} }; //返回真币数组下标
int getRelCoin(int coin[],int m,int n)
{
if(n-m+<=)
{
cout<<"硬币数小于3枚!!!无解";
return -;
}
else
{
if(coin[]==coin[])
{
return ;
}
else
{
if(coin[]==coin[])
return ;
else
{
return ;
}
}
} };
原创,转载请注明来源,默@语:www.h-five.com

n枚硬币问题(找假币)的更多相关文章

  1. Java实现8枚硬币问题(减治法)

    1 问题描述 在8枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重.可以通过一架天平来任意比较两组硬币,设计一个高效的算法来检测这枚假币. 2.1 减 ...

  2. xth的第 12 枚硬币(codevs 1366)

    题目描述 Description 传说 xth 曾经拥有11枚完全相同硬币(你懂得),不过今年呢,rabbit又送了他一 枚硬币.这枚硬币和其他硬币外观相同,只有重量不同,或轻或重.Xth 一不小心, ...

  3. 1366 xth 的第 12 枚硬币

    1366 xth 的第 12 枚硬币  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 传说 xth 曾 ...

  4. Ex 6_19 至多用k枚硬币兑换价格_第七次作业

    子问题定义: 定义一个二维数组b,其中b[i][j]表示用i个硬币是否能兑换价格j,表示第i个币种的面值, 递归关系: 初值设定: 求解顺序: 按下标从小到大依次求解数组b每一列的值,最后二维数组b的 ...

  5. POJ1013称硬币【枚举】

    Counterfeit Dollar Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 52474   Accepted: 16 ...

  6. 《algorithm puzzles》——谜题

    这篇文章开始正式<algorithm puzzles>一书中的解谜之旅了! 狼羊菜过河: 谜题:一个人在河边,带着一匹狼.一只羊.一颗卷心菜.他需要用船将这三样东西运至对岸,然而,这艘船空 ...

  7. c语言进阶10-算法

    一.  数据结构和算法关系 为什么要学数据结构和算法? 通常,计算机解决问题的步骤如下: 在数学模型中,计算机处理的对象之间通常存在着一种最简单的线性关系,这类数学模型就是线性的数据结构.著名计算机科 ...

  8. Java-POJ1013-Counterfeit Dollar

    在13枚硬币中找出fake的那一个 输入:三次天平称量结果 package poj.ProblemSet; import java.util.Scanner; /* 我怎么觉得是贪心算法呢? 起初对所 ...

  9. c语言进阶15-数据结构总结

    数据结构结论 1.阿基米德说过:“给我一个支点,我就能翘起地球”. 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成.记为:Data_Structure=(D, ...

随机推荐

  1. 低信噪比的HTML5优化

    百度搜索引擎建议是我们的HTML文件最好不要超过128KB,其实现在对于那些大文件搜索引擎也是很容易就抓取到的,只不过我们是尽量在可能的情况下把我们的网页代码越精简越好,我们要知道搜索引擎抓取网页的时 ...

  2. 线程池之 Callable、Future、FutureTask

    java线程中的异步和同步,并不是走路,一定要搞清楚.那么join方法嘛,就是异步变同步.线程阻塞,就再楼下一直等着它想要的状态出现喽.直接上代码,先来看Future获取线程执行结果的使用示例: pu ...

  3. C#多线程学习笔记

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  4. 【特别推荐】10款唯美浪漫的婚礼 & 结婚纪念网站模板

    互联网的重要性不言而喻,如今我们的生活已经完全离不开网络.这里给大家分享一组唯美浪漫的结婚邀请网站以及婚礼请柬网站模板,如果你也正想制作这样的网站,相信这些漂亮的网站模板能够带给你很大的帮助,让你快速 ...

  5. 总结CSS3新特性(颜色篇)

    颜色: CSS3新增加了hsl(), hsla(), rgb(),rgba()四个函数来创建color值; hsl(): hsl函数:h(色调),s(饱和度),l(亮度); 色调:为0-360之间的数 ...

  6. 高性能JS笔记3——DOM编程

    一.访问与修改DOM DOM和JS 相当于两个岛屿,访问操作的次数越多,要交的过路费越多,对性能产生很大影响. 减少访问DOM的次数,把运算尽量留在JS端操作. 二.innerHTML 对比 DOM ...

  7. 腾讯bugly 的crash 上报和umeng的比较

    说到crash上传工具,大家肯定会第一时间想到umeng,不错,umeng 是最早推出 crash 上报的工具之一,在刚推出来的时候,特别受到ios开发人员的喜爱. 因为个时候,内存是手动管理的,很容 ...

  8. 【C语言】C语言函数

    目录: 1. [函数注意点] 2. [函数目的] 3. [函数格式] 4. [函数定义前需明确的条件] 5. [函数的形参.实参] 6. [函数返回值注意点] 7. [为什么要return] 8. [ ...

  9. Android java传递int类型数组给C

    接着前面的文章<Android java传递int类型数据给C><Android java传递string类型数据给C>,继续实践 实现public native int[] ...

  10. android fragment 的用法以及与activity的交互和保存数据的方法,包括屏幕切换(转载)!

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37992017 1.管理Fragment回退栈 类似与Android系统为Acti ...