• CSU 2018年12月月赛 G(2219): Coin


    Description

    有这样一个众所周知的问题:

    你面前有7个硬币,其中有一个劣质的(它比正常的硬币轻一点点),你有一个天平,问需要你需要使用天平多少次能保证找到那个劣质的硬币。

    众所周知的算法是:

    第一次 把7个硬币分成3+3+1一共3堆,把前两堆放到天平的两端,若天平平了说明第三堆即剩下的那一枚硬币是劣质的,否则劣质的硬币在较轻的那一堆。

    第二次 把3个硬币分成1+1+1一共3堆,把前两堆放到天平的两端,若天平平了说明第三堆即剩下的那一枚硬币是劣质的,否则劣质的硬币是较轻的那一堆的那一个硬币。

    综上一共需要两次。

    那么如果是9枚硬币呢?

    第一次 把9个硬币分成4+4+1一共3堆,把前两堆放到天平的两端,若天平平了说明第三堆即剩下的那一枚硬币是劣质的,否则劣质的硬币在较轻的那一堆。

    第二次 把4个硬币分成2+2一共2堆,把这两堆放到天平的两端,天平必然会倾斜,说明劣质的硬币在较轻的那一堆。

    第三次 把2个硬币分成1+1一共2堆,把这两堆放到天平的两端,天平必然会倾斜,说明劣质的硬币是较轻的那一堆的那个硬币。

    综上一共需要三次。

    现在,问题来了。要是摆在你面前的是n枚硬币,你需要用以上描述的这种算法操作多少次,才能保证找到那个劣质的硬币呢?

    Input

    一行一个正整数n,表示硬币的总数。

    n < =109

    Output

    一行一个整数,表示需要使用天平多少次能保证找到那个劣质的硬币

    Sample Input

    7

    Sample Output

    2

    题意:这题看过程就知道了,每次分成两堆,能整份两堆就是一人一半,不然就拿出一个,剩下的分成一人一半,然后最后剩到一人一个的时候(所以是>=2,不是>2)就知道谁轻了。
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #include <math.h>
    #include <set>
    using namespace std;
    int n,x,temp;
    int main()
    {
        cin>>n;
        int ans=0;
        while(n>=2)
        {
            ans++;
            n=n/2;
        }
        cout<<ans<<endl;
        return 0;
    }
    
    /**********************************************************************
        Problem: 2219
        User: therang
        Language: C++
        Result: AC
        Time:4 ms
        Memory:2020 kb
    **********************************************************************/


  • 相关阅读:
    Python基础---------数据类型
    Linux----------Rabbitmq消息队列
    常用消息中间件对比
    Linux-------------kafaka基础
    Linux------------zookeeper基础
    CentOS使用chkconfig增加开机服务提示service xxx does not support chkconfig的问题解决
    Linux-------------MongoDB基础
    Web Service
    AutoResetEvent和ManualResetEvent(多线程操作)
    方法的可变参数 params
  • 原文地址:https://www.cnblogs.com/jkzr/p/10163619.html
Copyright © 2020-2023  润新知