日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

【模拟】杯子

發(fā)布時(shí)間:2023/12/3 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【模拟】杯子 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

杯子

題目大意:

有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é)

以上是生活随笔為你收集整理的【模拟】杯子的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。