當(dāng)前位置:
首頁 >
【模拟】杯子
發(fā)布時(shí)間:2023/12/3
47
豆豆
杯子
題目大意:
有n個(gè)1,現(xiàn)在可以將兩個(gè)相同的數(shù)加在一起,使數(shù)字個(gè)數(shù)-1,現(xiàn)在要將數(shù)字個(gè)數(shù)控制在k以下(包括k),但可能要多加幾個(gè)1,現(xiàn)在問你最少加多少個(gè)1
輸入樣例#1
3 1輸出樣例#1
1輸入樣例#2
13 2輸出樣例#2
3輸入樣例#3
1000000 5輸出樣例#3
15808數(shù)據(jù)范圍
對(duì)于50%的數(shù)據(jù),N≤10000000;
對(duì)于100%的數(shù)據(jù),N≤1000000000,K≤1000。
解題思路:
先把n轉(zhuǎn)換成二進(jìn)制,然后看看不加1時(shí),可以合成成那幾個(gè)數(shù),然后判斷數(shù)字個(gè)數(shù)是否小于k,如果不是,那就把最小的數(shù)加到第二大的數(shù),然后合成,以此類推
代碼:
#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;//取出每個(gè)位上的1l<<=1;}d=a[1];//最小位sum=2;//次小位while(num>k+sum-2){ans+=a[sum]-d;//加上當(dāng)前加的d=(a[sum]<<1);//進(jìn)一位sum++;//繼續(xù)往下}printf("%lld",ans); }總結(jié)
- 上一篇: 有个国家他很伟大是哪首歌 演唱者是谁
- 下一篇: 【DP】玩具