找假币

2024-04-25 14:18
文章标签 假币

本文主要是介绍找假币,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一个国王要赏赐一个大臣30枚金币,但其中有一枚是假币。国王提出要求:只能用一个天平作为测量工具,并用尽量少的比较次数找出这枚假币,那么余下的29枚金币就赏赐给这个大臣;否则这个大臣将得不到赏赐。已知假币要比真币的分量略轻一些。

样例输入:

30
2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

样例输出:

11


典型的分冶问题;



	static Scanner sc=new Scanner(System.in);static int a=sc.nextInt();static int[] i=new int[a];public static void main(String[] args){for(int b=0;b<a;b++){i[b]=sc.nextInt();}System.out.println(FalseCoin(i,0,a-1));}public static int FalseCoin(int[] coin,int low,int high){int sum1=0,sum2=0,sum3=0;if(low==high-1){//递归出口之一,当只剩两个银币时候的情况if(coin[low]>coin[high]){return high+1;}if(coin[low]<coin[high]){return low+1;}}if((high-low+1)%2==0){//如果n是偶数for(int i=low;i<=low+(high-low)/2;i++){//前半段和sum1=sum1+coin[i];}for(int i=low+(high-low)/2+1;i<=high;i++){//后半段和sum2=sum2+coin[i];}if(sum1>sum2){return FalseCoin(coin,(high-low)/2+1,high);}else{return FalseCoin(coin,low,low+(high-low)/2);}}else{//n为奇数for(int i=low;i<=low+(high-low)/2-1;i++){sum1=sum1+coin[i];}for(int i=low+(high-low)/2+1;i<=high;i++){sum2=sum2+coin[i];}sum3=coin[low+(high-low)/2];//中间数if(sum1>sum2){return FalseCoin(coin,low+(high-low)/2+1,high);}else if(sum1<sum2){return FalseCoin(coin,low,low+(high-low)/2-1);}if(sum1+sum3==sum2+sum3){//此时,sum1==sum2,再比较他们和sum3的关系return low+(high-low)/2+1;//另一个递归出口}}return 0;}


这篇关于找假币的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/934920

相关文章

120 - 算法 - 枚举算法 2692 假币问题

#include <iostream>#include <cstdio>using namespace std;/*问题:枚举问题 解决办法openjudge:2692假币问题解决思路:考虑每一个位置 为轻light 为heavy 为even计算符合这个假设情况既可以输出。时间:2021年3月30日0时38分*///数据结构定义int status[12];char left1[3][

在120枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重。可以通过一架天平来任意比较两组硬币,最坏情况下,能不能只比较5次就检测出这枚假币?

能 这道题目我想先通过另外一道题目引入我的方法: 在13枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重。可以通过一架天平来任意比较两组硬币,最坏情况下,能不能只比较3次就检测出这枚假币? 将13枚硬币分为三组 ABCD  EFGH  IJKLM 这里引入一个概念,每次天平倾斜方向称之为X方向、Y方向、和平衡 X方向不一定就是向左倾斜,

12硬币中有一个不知道轻重的假币,用天平将它找出来

问题1:假设有8个硬币,里面有一个硬币是假币,并且知道它是重了还是轻了(假设是轻了),现在给你一个天平,要求用最小次数将这个硬币找出来. 这时候可以用一种类似二分法的算法来找出这个假币.将左边4个和右边4个比较,因为知道硬币是轻了,所以很快就能确定那堆硬币里面有假币,这时候问题的规模由原来的8变成了4....然后对4个硬币也采用同样的办法...最终3次找出那个假硬币 问

【计蒜客】假币问题 (水题)

思路: 把这个人的运气当成最差的,只要硬币数不是1就找不到假币。所以就用它循环除2,看循环次数就行了。 AC: #include<iostream>using namespace std;typedef long long ll;int main(){ll m,d;while(cin >> m){d=0;while(m!=1){m/=2;d++;}cout << d << endl;

减治法(引例中位数、查找问题:折半二叉选择、排序问题:堆排序、组合问题:淘汰赛冠军问题假币问题)

分治法需要对分解的子问题分别求解,再对子问题进行合并,减治法只对一个子问题求解,并且不需要进行解的合并。减治法的效率更好。 *时间复杂性为log2n *思路:如果n=1,返回a的值;n是偶数且n>1,把该问题的规模减半,计算a^n/2的值;n是奇数且n>1,先利用偶指数的规则计算a^(n-1),再把结果乘以a             a   n=1 a^n=    (a^n/2)^2

查找假币--天平秤重法(C++,完善版)

一、题目 编写一个实验程序查找假币,有n(n>3)个硬币,其中有一个假币,且假币较轻,采用天平秤重方式找到这个假币,并给出操作步骤。 本篇文章是基于博主(逆风的蔷薇)的思路进行进一步完善的,感谢大神的思路!! 附原文链接: http:// https://blog.csdn.net/fly_yr/article/details/48350551?utm_source=app&app_ver