【模拟】杯子

十年热恋 提交于 2019-11-26 12:14:31

杯子

题目大意:

有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);
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!