杯子
题目大意:
有n个1,现在可以将两个相同的数加在一起,使数字个数-1,现在要将数字个数控制在k以下(包括k),但可能要多加几个1,现在问你最少加多少个1
输入样例#1
3 1
输出样例#1
1
输入样例#2
13 2
输出样例#2
3
输入样例#3
1000000 5
输出样例#3
15808
数据范围
对于50%的数据,N≤10000000;
对于100%的数据,N≤1000000000,K≤1000。
解题思路:
先把n转换成二进制,然后看看不加1时,可以合成成那几个数,然后判断数字个数是否小于k,如果不是,那就把最小的数加到第二大的数,然后合成,以此类推
代码:
#include<cstdio>
using namespace std;
typedef long long ll;
ll n,k,l,d,num,sum,ans,a[100];
int main()
{scanf("%lld %lld",&n,&k);l=1;while (n) {if (n&l) n-=l,a[++num]=l;//取出每个位上的1l<<=1;}d=a[1];//最小位sum=2;//次小位while(num>k+sum-2){ans+=a[sum]-d;//加上当前加的d=(a[sum]<<1);//进一位sum++;//继续往下}printf("%lld",ans);
}