杯子
题目大意:
有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;//取出每个位上的1
l<<=1;
}
d=a[1];//最小位
sum=2;//次小位
while(num>k+sum-2)
{
ans+=a[sum]-d;//加上当前加的
d=(a[sum]<<1);//进一位
sum++;//继续往下
}
printf("%lld",ans);
}
来源:https://blog.csdn.net/ssllyf/article/details/98846291