div3的B题没想到二进制,挫败感满满,+ 之前碰到二进制的题目就害怕【进制转换留下的阴影】
佬的博客笔记,跟着学习,好强!记录学习笔记~
一、基础知识
- 1.位运算
使用情景:分支为两种情况互相转换
1、与(&) 同1为1,不同为0 【同进1】
2、或(|) 同0为0,不同为1 【不同进1】
3、非(~) 本身的二进制中0为1,1为0【换位】
4、异或(^) 两个数二进制位不同结果为1,相同为0【同1异0】
异或也叫半加运算,其运算法则相当于 不带进位的二进制加法
一个数异或同一个数两次,则结果还是原数,就是(a^b)^b=a
0异或任何数=0+任何=任何数,就是0^a=a
1异或任何数=1+任何且不进制=任何数取反
- 2.位移操作【箭头指向哪里,就往哪里移动x位】
1、左移 << 乘法运算 bit(1<<x) 乘 2^x
2、右移>> 除法运算 bit(1>>x) 除2^x
- 3.二进制枚举
使用情景:被枚举元素只有2种情况,eg.灯的开关,一种东西取或者不取
二、相关例题:
1)二进制枚举
题目:有n块钱,每一种蛋糕的价格成2的倍数递增2^0 2^1 2^2…… 现有k种蛋糕,最多有多少种购买方式
思路:1.蛋糕价格2次方递增,每种1、0两种状态,可以用二进制枚举来设1为拿与0为不拿
Eg.n=1010 k=3 二进制有3位,共有2^k种(包含0)
若k=4,则有10+1种拿法 0000 0001 0010 … 小于10的数字的二进制都满足条件
2)异或运算【两两相消】
有n个字符串,和n-1个匹配字符串,字符串相同的两两配对,找出哪一个字符串没有匹配字符串
1)异或两次=本身 两两相消
2)数字类型:
任何数异或0=任何数 相当于*1
0搭配异或两次同一个数字有魔法效果--->归0 (0^任何)^任何=0
0搭配异或1次同一个数字有平常效果--->归数字 0^任何=任何
用来找单身狗数字好用max
字符串类型:
(Str1^str2^str3)^str2^str3=str1 字符串每个位置取异或 【for循环实现】
3)二进制枚举板子题:
给出长度为n的数组,求能否从中选出若干个,使他们的和为K.如果可以,输出:Yes,否则输出No
思路:板子,判断能否使用条件:1.拿与不拿两种状态 2.任意个数
4)二进制枚举
题目:初始值为t。路过十字路口,数值*2或加油站,数值-1,最终恰好为1求符合条件的个数
思路:----> 两种状态互相转换,可以用二进制来模拟所有状态(筛选条件符合的cnt1=5,cnt2=9)
十字路口1 加油站0 两个for循环枚举i种模式和第j位置
tip.最后一个为十字路口,也就是实际上有10-1=9个十字路口
![](https://img-blog.csdnimg.cn/cf455011c78344e2ba304f068af167ea.png)
5)二进制枚举
题目:给你n张扑克,每张都对应一个点数,分别对应1-13,K 就是13;J 是11;Q是12;
现在想从这些扑克牌中取出一些牌,让这些牌的点数的和等于一个幸运数值P,问有多少种 方案?
思路:每张扑克拿or不拿 1or0 13张扑克--->13位 for循环i个情况,每个情况第j位拿不拿
![](https://img-blog.csdnimg.cn/b04c2811abf94372a0bea8d965f3dd79.png)
6)二进制枚举应用
题目:
在选举问题中,总共有n个小团体,每个小团体拥有一定数量的选票数。如果其中m个小团体的票数和超过总票数的一半,则此组合为“获胜联盟”。n个团体可形成若干个获胜联盟。一个小团体要成为一个“关键加入者”的条件是:在其所在的获胜联盟中,如果缺少了这个小团体的加入,则此联盟不能成为获胜联盟。一个小团体的权利指数是指:一个小团体在所有获胜联盟中成为“关键加入者”的次数。请你计算每个小团体的权利指数。
长度为n的数组,n个中若干个随机组合,和为cnt。若cnt>sum/2,判断组成的数中每一个的值是否为关键一篇。若是权值增加
思路:
每个小团体两个状态,参与1,不参与0 二进制枚举所有可能性
for循环i种情况,for循环第j位,加入其中,总和若>sum/2,每一位是否为关键,b[j]++
![](https://img-blog.csdnimg.cn/95f9661297d74f67943f5a821c1fd48e.png)
收获满满的一天,虽然感觉大部分题目都是二进制的枚举~
暑假前把y总基础算法给刷刷完!!!
六级弃掉,不管了o(╥﹏╥)o
明天也要开始大物的复习啦~~~
晚安 1:10