https://www.luogu.org/problem/show?pid=1582

题目描述

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

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

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

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1:

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

   样例1:
1
   样例2:
3
   样例3:
15808

依题意可得,每2^x个瓶子可以合成一个瓶子。

以样例13 5来说,

13=8+4+1.

也就是说13个瓶子可以合并成3个瓶子,但此时不满足“小于k个”条件,所以需要购买空瓶子。

买1个,14=8+4+2,没有什么卵用。

买2个,15=8+4+2+1,好像更糟。

买3个,16=16,搞定。

根据上述过程可以得出初步思路:算出n可以分成几个2^x相加,也就是可以合成几个瓶子。如果结果>k那么买一个空瓶重复上述过程。

但是这里需要一个小技巧,如果你分解数的时候暴力枚举,时间肯定爆炸。

由于是2^x,所以我们很容易地想到2进制。所有2的倍数的二进制都是100000……(好多好多的0)

观察样例13的二进制: 1101.相当于二进制1000+100+1即十进制8+4+1.

得出结论,要统计有多少个因子(好像不叫因子,反正就那意思),只需要数数当前瓶子数的2进制下有多少个1即可。

那么我们需要一位位比较。如果把整个数转成二进制时间不说了。

如何快速的获得此数二进制数下的某一位呢?

我们只需要构造一个数,这个的二进制数是0000000000000000000100000000(1<<N)

然后再把当前数与该数按位与,就可以得出当前数二进制下某一位。

交上去发现悲伤的超时了。

所以我们需要优化。其实每一次加1的目的就是为了让数中的0变少。就是需要进位。

此时我们把瓶子数量的二进制取反再加一,进位就变得容易多了

稍有常识的人都会知道,n的二进制取反再加一就是-n。

 1 #include<bits/stdc++.h>
2 using namespace std;
3 typedef long long ll;
4 int main()
5 {
6 ll n,k;
7 cin>>n>>k;
8 ll ans=0;
9 do
10 {
11 ll zs=0;
12 for(ll i=0;i<63;i++)
13 if((n&((ll)1<<i))>0) zs++;
14 if(zs<=k) break;
15 ans+=n&(-n);
16 n+=n&(-n);
17 }while(1==1);
18 cout<<ans<<endl;
19 return 0;
20 }

最新文章

  1. asp.net mvc4使用NPOI 数据处理之快速导出Excel文档
  2. Authcode()
  3. EXTJS信息提示框的注意事项
  4. Quartz.Net在windows服务中的使用
  5. MessageDigest简介
  6. PLSQL_性能优化系列17_Oracle Merge Into和Update更新效率
  7. const type&amp; 与 type&amp; 的区别
  8. 关于SqlServer修改数据库常用信息的方法
  9. QTableView的表格项中加入图标的方法(重载View::mouseMoveEvent,并使用View::setIconSize函数设置图标的大小)
  10. JavaWeb 文件 上传 下载
  11. cocos2d-x 游戏开发之有限状态机(FSM) (三)
  12. Vue子页面给父页面传递数据
  13. 第17课 类型萃取(1)_基本的type_traits
  14. mysqldump数据导出问题和客户端授权后连接失败问题
  15. 洛谷AC破百题纪念!
  16. 利用gsoap工具,通过wsdl文件生成webservice的C++工程文件
  17. C:基础知识
  18. VMware下centos桥接模式静态ip配置
  19. GPUImage API文档之GLProgram类
  20. The last time the sprint(最后一个冲刺)

热门文章

  1. 使用Windows客户端连接Linux系统中的MySQL时产生的错误已经解决
  2. 连通图与Tarjan算法
  3. 位(bit)、字节(Byte)、字(Word)、双字(Dword)之间的关系
  4. miniFTP项目实战一
  5. Python3 * 和 ** 运算符
  6. C#中的几种锁:用户模式锁、内核模式锁、动态计数、监视锁
  7. 【java虚拟机】jvm调优
  8. 三 MongoDB进阶
  9. 【MATLAB】常用命令快速入门,国赛加油
  10. vue3.0入门(三)