找假币

Posted dabai56

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了找假币相关的知识,希望对你有一定的参考价值。

技术图片

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

这是一个能通过的解答:

// 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时。

以上是关于找假币的主要内容,如果未能解决你的问题,请参考以下文章

假币问题

(枚举)称硬币

分治算法在 O(logn) 中找到假币

分治算法理解

算法系列之枚举称硬币

2692 假币问题(枚举——数学模型中包含多个变量)