二进制

题目链接:here

对于 n 瓶一升的水,把他们合并后,最少需要的瓶子数为 n 的二进制中 1 的个数。假 设 n 的二进制中 1 的个数大于 k,那么我们要找到 1 个大于 n 的数,且二进制中 1 的个数等 于 k 的最小的数 m,那么答案为 m-n。

假设 n 二进制中,最右边的 1 在第 i 位(这里的第几位是从右往左数的,最右边为第 0 位),那么假设你加上一个小于 2^i 的数,结果二进制中 1 的个数只会增加,如果加上一个 2^i,则结果二进制中 1 的个数必定不会增加。所以只需要一直加上一个 2^i(这里的 i 表示 的是当前水的总体积的二进制中最右边的 1 所在的位置)直到结果中 1 的个数等于 k 即可

 1 #include <iostream>
 2 #include<cstdio>
 3 #define ll long long
 4 using namespace std;
 5 int cs[100010];
 6 int main()
 7 {
 8     int t;
 9     scanf("%d",&t);
10     int n,k;
11     while(t--)
12     {
13         int ans=0;
14         scanf("%d%d",&n,&k);
15         cs[0]=0;
16         int b=0,cnt=1;
17         while(n)
18         {
19
20             if(n&1) cs[cnt++]=1<<b;
21             n>>=1;
22             b++;
23         }
24         int f=cnt;//杯子
25         for(int i=0;i<cnt&&f>k;i++)
26         {
27            ans+=(cs[i+1]-cs[i]);
28             cs[i+1]<<=1;
29             f--;
30         }
31         printf("%d\n",ans);
32     }
33 }
34
35 /**************************************************************
36     Problem: 1228
37     User: yijiull
38     Language: C++
39     Result: Accepted
40     Time:0 ms
41     Memory:2088 kb
42 ****************************************************************/

很久之前做的了,粘过来~

时间: 2024-10-01 00:02:00

二进制的相关文章

python中 将你的名字转化成为二进制并输出

1 name = "吴彦祖" 2 for i in name: 3 i_by = bytes(i, encoding = "utf-8") 4 for i_bin in i_by: 5 i_b = bin(i_bin) 6 print(i_b) 输出结果: 0b10110100 0b10100110 0b10010110 我们来详细解读每个转换步骤:for i in name: 通过for循环获取所有的字符i,共获取了3个字符 i_by = bytes(i, enc

JavaScript 二进制的 AST

本文和大家分享的主要是javascript中二进制的 AST相关内容,一起来看看吧,希望对大家学习javascript有所帮助. 背景介绍 多年来,JavaScript 已经从最慢的脚本语言之一,从老爷车发展为兰博基尼,不管是通过 Web 浏览器还是其他环境.它都能够快到可以运行桌面.服务器.移动甚至嵌入式应用程序. 随着 JavaScript 的增长,应用程序的复杂程度和规模都越来越复杂.然而,二十年前,少数使用过 JavaScript 的网站也就加载几千字节的 JavaScript,许多网站

判断给定十进制整数的二进制形式中含有几个1

两种判断一个给定整数的二进制形式中含有几个1的简单方法: 主要思想是通过按位与(&)运算和位移运算(<< >>)实现 1 unsigned int_number( int n) 2 { 3 if (n < 0) 4 return; 5 unsigned count = 0; 6 while (n != 0) 7 { 8 if ((n & 1) != 0) 9 ++count; 10 n >>= 1; 11 } 12 return count; 13

二进制思惟以及数据的存储

我们平常运用的数字多是由 0~9 共十个数字构成的,例如 1.9.10.297.952 等,一个数字最多能表现九,假如要表现十.十一.二十九.一百等,就需求多个数字组合起来.例如表现 5+8 的后果,一个数字不敷,只能"进位",用 13 来表现:这时"进一位"相当于十,"进两位"相当于二十.由于逢十进一,也由于只要 0~9 共十个数字,所以叫做十进制(Decimalism).进制也就是进位制.在停止加法(减法)运算时,逢X进(借)一就是X进制,这

使用C#向Sql Sever中存取网络图片和本地图片(二进制流的形式)

先是做普通的,存储我们本地的图片,将它转化为二进制流存储到数据库对应的表中. 代码如下: string path = "../../A.jpg"; FileStream fs = new FileStream(path, FileMode.Open); int streamLength = (int)fs.Length; //获取文件流的长度. byte[] image = new byte[streamLength]; //声明字节数组,用于保存图片文件 fs.Read(image,

centos6.5二进制安装mysql

[[email protected] ~]# yum install libaio-devel -y    #安装共享库 [[email protected] ~]# wget http://mirrors.sohu.com/mysql/My ... ux2.6-x86_64.tar.gz #下载MySQL二进制包 [[email protected] ~]# tar xf mysql-5.5.48-linux2.6-x86_64.tar.gz #解压二进制包 [[email protected

Codeforces Round #149 (Div. 2) E. XOR on Segment (线段树成段更新+二进制)

题目链接:http://codeforces.com/problemset/problem/242/E 给你n个数,m个操作,操作1是查询l到r之间的和,操作2是将l到r之间的每个数xor与x. 这题是线段树成段更新,但是不能直接更新,不然只能一个数一个数更新.这样只能把每个数存到一个数组中,长度大概是20吧,然后模拟二进制的位操作.仔细一点就行了. 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath>

mariadb通用二进制格式安装

一.MariaDB安装介绍: 对于通用二进制格式的包,我们只需要解压缩后就能够使用数据库,听起来很容易,但必须要注意一些问题.二进制 格式的程序包是已经编译好的二进制程序,所以里边有很多脚本都是在固定的路径下执行的,所以安装过程中mysql这个路径必须安装在/usr/local目录下,并且目录名称必须叫mysql.如果不这样设置,一些脚本无法运行,更别提能成功安装了. Mariadb通用二进制格式相关文件说明 当获取到Mariadb通用二进制格式文件,解压后查看其文件如下:     [[emai

二进制文件文本文件和二进制数据

我们知道计算机是用二进制来做运算处理的,所以所有存储在计算机里面的东西都是二进制的. 我也知道这句话,但为什么总是听到别人说"二进制"文件和"文本"文件呢? 按照上面那句话来说计算机里面的都应该是二进制的啊! 底层存储的都是二进制的"数据",而不是二进制的文件. 列举一个二进制文件如下: 00000000h:0F 01 00 00 0F 03 00 00 12 53 21 45 58 62 35 34; .........S!EXb54 0000