找假币

就是输入一堆硬币的个数,输出最快的情况下最少几次能搞定?

这是一个能通过的解答:

// write your code here cpp
#include <iostream>
using namespace std;
//分三次称,每次分配使天平一边的硬币数大于剩余没称的硬币数,
//因此称1次后,最多再需要称的次数等于在天平一边的硬币数中找出假币需要称的次数
//可是为什么称三次最快呢?
int func(int num)
{
    if(num == 1)
        return 0;
    else if(num < 3)
        return 1;
    int m;
    m = (num + 2) / 3; //一边天平上硬币的个数,对num+2使得天平上的硬币数大于等于剩余的硬币数
    return func(m) + 1;
}

int main()
{
    int num = 0;
    while(cin >> num)
    {
        if(num == 0) break;
        int count = 0;
        count = func(num);
        cout << count << endl;
    }

    return 0;
}

为什么每次分三份最快呢?

分析:

分两份,天平称一次后,最多能排除一半(最多情况:可二分)

分三份,天平称一次后,一定能找到假币在哪一份中,最多能排除2/3

分四份,称一次可能还找不到有假币的那一份,可排除一半;剩下两份再称一次,找到假币在的那一份,再分再称,就比分三份慢了。

分n份,就不说了,与分四份类似。

分三份,需保证天平一边硬币个数必须大于剩余的硬币数。不得已时剩余的硬币数甚至可为0,例如总数为4时。

原文地址:https://www.cnblogs.com/dabai56/p/11144605.html

时间: 2024-12-19 20:03:55

找假币的相关文章

n枚硬币问题(找假币)

问题描述: 在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

Python 趣味百题

趣味整数 1 不重复的3位数 -易 2 水仙花数 -易 3 完全数 -中 4 相亲数 -中 5 黑洞数 -中 6 勾股数 -易 7 自守数 -易 8 3位反序数 -中 趣味素数 1 素数 -中 2 孪生素数 -中 3 金蝉素数 -中 4 可逆素数 -中 5 回文素数 -中 6 平方回文素数 -中 7 梅森尼数 -中 8 哥德巴赫猜想 -中 9 等差素数数列 -中 趣味图形 1 回型矩阵 -中 2 九九乘法表 -易 3 杨辉三角 -易 数学问题 1 天平秤物 -难 2 黑色星期五 -易 3 存钱问

Class热替换与卸载

概述 名词解释:所谓热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用.本文主要是分析Tomcat中关于热部署和JSP更新替换的原理,在此之前先介绍class的热替换和class的卸载的原理. Class热替换 ClassLoader中重要方法: loadClass:ClassLoader.loadClass(…) 是ClassLoader的入口点.当一个类没有指明用什么加载器加载的时候,JVM默认采用AppClassLoader加载器加载没有加载过的class,调用的方法的入口就是

PostgreSQL中查找最大连续性字段

一.建表 lihao=#create table tb (id int,pid int,name varchar); lihao=#INSERT INTO tb VALUES (1, 0, '广东省'); lihao=#INSERT INTO tb VALUES (2, 0, '浙江省'); lihao=#INSERT INTO tb VALUES (3, 2, '衢州市'); lihao=#INSERT INTO tb VALUES (4, 2, '杭州市'); lihao=#INSERT I

Java对List对象进行排序

有时候需要对List对象进行排序,如果每一处都去写一个排序方法,就会产生重复代码的坏味道,而且每一处都写,工作量会很大.我们知道,Java提供了一个Collections.sort()方法可以对List排序,利用Java反射机制,很容易就能写出一个通用的排序方法. 为了防止出现不按照getter,setter规范命名的POJO类,我不打算动态调用getXXX()方法,而是直接获取对象的属性值.为了达到不论是否是public成员变量,都能获取到的目的,在获取到Field后,调用了setAccess

心若迅雷会员账号获取器

心若迅雷会员账号获取器是一个绿色免费的迅雷会员获取小工具,每天都会发布多个有效的迅雷会员账号供大家使用,用户可以使用这些账号登陆迅雷进行离线下载. 获取迅雷白金会员一人一号说明以及流程:点击下面的(立即获取白金会员一人一号)进行获取,会自动打开一个软件安装提示,点击(立即点击安装)然后点软件上的注册账号然后通过注册的账号登陆视频聊天软件,然后随便进个房间免费观看2分钟视频,2分钟以后软件自动发送一人一号白金账号到你邮箱!如果按操作后没发送到自己邮箱请联系客服QQ:1625223157领取一人一号

1057: 有假币

  1057: 有假币 时间限制(普通/Java):1000MS/10000MS   运行内存限制:65536KByte 总提交: 2844       测试通过:773 描述 居然有假币!!!  事情是这样的,现在猪肉涨了,但是农民的工资却不见涨啊,没钱怎么买猪肉啊.渊子这就去买猪肉,结果找来的零钱中有假币!!!可惜渊子一不小心把它混进了一堆真币里面去了.现在知道假币的重量比真币的质量要轻.给你一个天平,请用最快的时间把那个可恶的假币找出来. 输入 1≤n≤230,输入0结束程序. 输出 最少

假币问题

题目链接:http://134.208.3.122/JudgeOnline/problem.php?id=1180 题目描述 居然有假币!!! 事情是这样的,现在猪肉涨了,但是农民的工资却不见涨啊,没钱怎么买猪肉啊.老王这就去买猪肉,结果找来的零钱中有假币!!!可惜老王一不小心把它混进了一堆真币里面去了.现在知道假币的重量比真币的质量要轻.给你一个天平,请用最快的时间把那个可恶的假币找出来. 输入 输入有多行,每一行的值为硬币的数目n,1≤n≤2^30,输入0结束程序 输出 最少要称多少次一定能

poj1029(找假硬币)模拟

题意:给n个硬币,其中有一个硬币和其他的硬币重量不一样,给出k次比较重量的结果.问是否可以将假硬币找出来. 解法:判断一个硬币是真币的方法(满足其一): 1.这个硬币出现过在=的两边 2.既出现在小于的一边过,也出现在大于的一边过. 如果排除这些硬币后只剩下一个,那么假币就是剩下的那个,否则就是不确定. 代码: /**************************************************** * author:xiefubao *********************