CSU1318: Small change

Description

打完网赛,就到了晚饭的时间,但CSU_ACM的同学们都已经没力气出去了,这时CX建议大伙一起点餐吧,因为正是饭点,CX为了不让大家等太久,找了一个承诺20分钟送到超时要打折的外卖。但CX的RP都在网赛上用光了,果然送餐的迟到了,按规定咱们是要少给钱的。可是那些送餐员十分的狡猾,他们没有带零钱,于是乎,原价为N元的饭,由于他们的迟到可能需要降价,这些狡猾的送餐员会随机报一个数∈(1,N),如果CSU_ACM的小基友没有恰好这么多钱的话,送餐员还是按原价收取饭钱。为了CSU_ACM的最大利益,想知道最少由多少张钞票可以应对送餐员的任意要求(每张钞票的价值可为任意正整数),不论送餐员报的数字为多少总能给出相应的零钱。

Input

多组数据(不超过20组),输入到文件结束。

输入为CSU_ACM的小基友们点餐的总价N.(1<=N<=100000)

Output

输出为CSU_ACM的小基友们准备的零钱的最少张数。每个测试数据一行。

Sample Input

1 2 5

Sample Output

1 2 3
 
 
其实这题就是一个二进制拆分的问题,我们知道1,2,4,8,16一直到2^n能通过相加组成所有的数,所以这道题只要运用二进制拆分就能解决了
 
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;


int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        if(n == 1)
        printf("1\n");
        else if(n<=3)
        printf("2\n");
        else if(n<=7)
        printf("3\n");
        else if(n<=15)
        printf("4\n");
        else if(n<=31)
        printf("5\n");
        else if(n<=63)
        printf("6\n");
        else if(n<=127)
        printf("7\n");
        else if(n<=255)
        printf("8\n");
        else if(n<=511)
        printf("9\n");
        else if(n<=1023)
        printf("10\n");
        else if(n<=2047)
        printf("11\n");
        else if(n<=4095)
        printf("12\n");
        else if(n<=8191)
        printf("13\n");
        else if(n<=16383)
        printf("14\n");
        else if(n<=32767)
        printf("15\n");
        else if(n<=65535)
        printf("16\n");
        else
        printf("17\n");
    }

    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值