杯子

杯子

题目描述

小明买了N个容积可以是无穷大的杯子,刚开始的时候每个杯子里有1升水,接着小明发现杯子实在太多了,于是他决定保留不超过K个杯子。每次他选择两个当前含水量相等的杯子,把一个杯子的水全部倒进另一个里,然后把空瓶丢弃。(不能丢弃有水的杯子)  
显然在有些情况下小明无法达到他的目标,比如N=3,K=1。此时小明会重新买一些新的杯子(新杯子容积无限,开始时有1升水),以达到目标。  
现在小明想知道,最少需要买多少个新杯子才能达到目标呢?  

输入

一行两个正整数,N,K(1≤N≤1000000000,K≤10)。 

输出

一个非负整数,表示最少需要买多少新杯子。 

样例输入

复制样例数据

3 1 
样例输出
1


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>

#include <bits/stdc++.h>

using namespace std;

 

typedef long long in;

const int N = 1e5+10;

in a[N];

int main()

{

    in n,k;

    cin>>n>>k;

    if(k>=n) {

        printf("0\n");

        return 0;

    }

    in cnt=1;

    in t=n;

    while(t){

        a[cnt++]=t%2;

        t/=2;

    }

    in cnt1=0;

    for(in i=1;i<=cnt;i++){

        if(a[i]==1) cnt1++;

    }

    if(cnt1<=k) {

        cout<<0<<endl;

        return 0;

    }

    in cnt11=0;

    in x;

    in y;

    for(in i=cnt;i>=1;i--){

        if(a[i]==1) cnt11++;

        if(cnt11==k){

            x=i-1;

            y=1;

            for(in j=2;j<=i;j++){

                y*=2;

            }

            break;

        }

    }

    cnt11=0;

    t=1;

    for(in i=1;i<=x;i++){

        cnt11+=a[i]*t;

        t*=2;

    }

    in ans=y-cnt11;

    cout<<ans<<endl;

    return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值