位运算
树图思维导图提供 位运算 在线思维导图免费制作,点击“编辑”按钮,可对 位运算 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:ba7341139eea32cb67900ec69f95a8f1
位运算思维导图模板大纲
1247:河中跳房子
思路
这就是一道典型的二分答案(最大的最小值)模板题
做法
#include<bits/stdc++.h> using namespace std; int a[50005],L,n,m; int check(int x){ int past=a[1],cnt=0; for(int i=2;i<=n+2;i++){ if(a[i]-past>=x) past=a[i]; else cnt++; } return cnt; } int main(){ cin>>L>>n>>m; a[n+2]=L; a[1]=0; for(int i=2;i<=n+1;i++) scanf("%d",&a[i]); int l=1,mid,r=a[n+2]-a[1]; while(l<r){ mid=(l+r+1)/2; if(check(mid)<=m) l=mid; else r=mid-1; } cout<<l; return 0; }
1238:一元三次方程求解
思路
这里的函数我们无法知道函数图像是怎么样的,有可能是上升,有可能是下降,还有可能是上升再下降再上升。所以我们只能根据题目给的条件,两个根之差一定大于1,并且画一下图便可知,有三种情况1.l与r的差大于1,这种情况下可能有解2.l与r代入方程之后值同号,这样有且可能有两个解3.l与r的差大于1且l与r代入方程后值同好,这一定无解
做法
double check(double x){ return a*x*x*x+b*x*x+c*x+d; } void check1(double l,double r){ if(r-l<1&&check(l)*check(r)>0) return;//这种情况一定无解,所以返回 double mid=(l+r)/2; if(abs(check(mid)-0)<=0.001){//精度 printf("%.2lf ",mid); return ; } //分成两个部分继续找剩余解 check1(l,mid); check1(mid,r); }
1433:【例题1】愤怒的牛
思路
做法与河中跳房子基本一致,只需要初始化一下就行
做法
for(int i=1;i<=n;i++){ scanf("%d",&a[i]); maxn=max(a[i],maxn); minn=min(a[i],minn); } sort(a+1,a+1+n); int k=n-m; int l=1,r=maxn-minn+1,mid;
位运算
只用于整形操作数,通常分为两类。1.逻辑运算符(位与&,位或|,异或^,取反~)2.位运算符(左移<<,右移>>)
位与&
操作对象同时为1才为1,否则为0
功能
用于二进制取位操作,如一个数&1就是取二进制末尾,&100就是取二进制倒数第三位
判断一个数的奇偶性,n%2==0可以替换成(n%1)==0
位或|
操作对象只要与一个为1即为1,否则为0
功能
用与二进制数无条件赋值,例如一个数|1,就是将末位强制转化为1,|100就是将倒数第三位强制转化为1
如果要把二进制数末位变成0,只需要|1再-1就行了
异或^
操作对象不同为1,相同为0
功能
可用于简单的加密,因为a^b^b=a,所以可以把a当成原文,b当成密钥。
位运算的等级极低,操作时候最好都添上符号以防万一