分石子(思维题 & 二进制)

Description

有n个石子,将它分成k堆,对于[1,n]的任意一个数,都能用某几堆石子组成(每一堆只能用一次),求k的最小值。

Input

多组样例输入输出,输入n(1=<n<=1e18)

Output

每个测试样例输出k,占一行,k的含义如题目所述

Sample Input 1

6
2
1
Sample Output 1

3
2
1
Hint

分成的任意两个石子堆中石子个数可以是相同的。

这个题目让你把n个石子分为k堆,我刚开始想的是1到k,然后利用等比求出来,一直wrong,后来经高人点化,原来是用二进制。不得不说二进制真的是个好东西,还是自己理解的不够深啊。一个数字在计算机中本来就是二进制表示的,也就是说给出的所有 n 一定是能够利用二进制表示的,1~n的数字也是,每一位就可以分为一组。这样的话直接求这个数的二进制位数就可以了。

扫描二维码关注公众号,回复: 3696936 查看本文章

AC代码:

#include <cstdio>
#include <cstring>
#include <cmath>
#define ll long long
using namespace std;

int main()
{
    ll n;
    while(~scanf("%lld", &n))
    {
        ll ans = 0;
        while(n)
        {
            n >>= 1;
            ans++;
        }
        printf("%lld\n", ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_40788897/article/details/82811027