ZCMU-校赛C-1778

1778: 分钱哪

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 241   Solved: 52
[ Submit][ Status][ Web Board]

Description

生活在杭州,大家是不是习惯了出门只带一只手机就好啦,无论是大商场还是街边小摊都能用上支付宝,不得不说真是方便呀,知识改变命运,科技改变生活,代码改变世界,每当放假回家,我就回到了没有支付宝的地方了,然后,就要使用人民币啦,麻烦的是大部分情况下是要找零,为了不找零,于是我决定事先做好准备,我把钱数好,然后放在一个个钱袋里面,以便在我现有的支付能力下,任何数目的钱,我都能够使用我事先准备好的小钱进行支付。当然,我很穷所以我想用最少的钱袋来实现这个愿望,并且不存在两个钱袋中装有相同的大于1的钱数。假设我有m个1元硬币,你能猜到我会用多少个钱袋?

Input

第一行T(T<=1000000),接下来一个整数,表示我现有的总的硬币数目m,其中,1≤m ≤1000000000

Output

Case #x: y,x表示测试编号从1开始,y一个整数表示答案

Sample Input

2
3
4

Sample Output

Case #1: 2

Case #2: 3


【解析】

这道题刚开始做的时候就知道是个规律题,队友一直在找规律,找出一个规律来不过那个时间复杂度也挺高的,

所以还是需要再找,比完之后问了别人才知道,这个其实是这样子的,比如你有2块钱,你放几个袋子能凑上1,2

肯定需要2个袋子,你第二个袋子放2的话,你有3个硬币,你只需要2个袋子就可以凑出1,2,3了,之后我们有四个

硬币了,我们需要几个袋子?答案是3个,第一个袋子放1,第2个袋子放2,第三个袋子放4,这样的话发现4,5,6,7

全部凑出来了,一次类推8个硬币需要4个袋子,可以凑到15为止,所以我们就能发现规律所在了。

#include
#include
#include
using namespace std;
int main()
{
    int n,m,p=0;
    scanf("%d",&n);
    while(n--)
    {
        int count1=0;
        p++;
        scanf("%d",&m);
        while(m!=0)
        {
            m=m/2;
            count1++;
        }
        printf("Case #%d: %d\n",p,count1);
    }
    return 0;
}

你可能感兴趣的:(ACM)