杯子(glass)

题目描述

一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水。接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子。每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒进另一个里,然后把空瓶丢弃。(不能丢弃有水的瓶子)

显然在某些情况下CC无法达到目标,比如N=3,K=1。此时CC会重新买一些新的瓶子(新瓶子容量无限,开始时有1升水),以到达目标。

现在CC想知道,最少需要买多少新瓶子才能达到目标呢?

输入输出格式

输入格式:

一行两个正整数, N,KN,K(1<=N<=10^9,,K≤1000)。

输出格式:

一个非负整数,表示最少需要买多少新瓶子。

输入输出样例

输入样例#1: 
3 1
输出样例#1: 
1
输入样例#2: 
13 2
输出样例#2: 
3
输入样例#3: 
1000000 5
输出样例#3:
 15808
 
 

解析:

由题意可知,每次只能由两个相同水量的杯子倒在一起,自然而然地想到和2n有关系。
可以理解为贪心,贪心策略是每次去取现有杯子数的2的最多次方,把他们合并,合并k次,如果剩下杯子,就去再凑2的最小次方,缺多少就得买多少,,,
这是海淀区赛的第一题,我在考场上忘记判零了,还好数据水。

 最后上AC代码

 1 #include<iostream>
 2 using namespace std;
 3 long long n,k,f,ans,s;
 4 int main()
 5 {
 6     cin>>n>>k;
 7     ans=n;
 8     for(int i=1;i<=k;i++)
 9     {
10         f=1;
11         while(f<ans)
12         {
13             f*=2;
14         }
15         f/=2;
16         ans-=f;
17     }
18     if(f>ans)cout<<f-ans;
19     else cout<<0;
20     return 0;
21 }
View Code

  



原文地址:https://www.cnblogs.com/szmssf/p/10834421.html