找假币

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

这是一个能通过的解答:

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值