找假币

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

这是一个能通过的解答:

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

posted @ 2019-07-06 23:05  大白的攻城狮  阅读(207)  评论(0编辑  收藏  举报