【模拟】杯子
杯子
題目大意:
有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); }總結
- 上一篇: 有个国家他很伟大是哪首歌 演唱者是谁
- 下一篇: 【DP】玩具