枚举与贪心3
加强训练,枚举 比较难的例题
例题:扫雷
2*2方格,
例题:开/灭灯游戏
4*4方格灯
枚举第一行
位运算
位运算
与&、或|、非~、异或^、左移<<、右移>>
优先级
比较>、<、==高于 位运算,加括号改变优先级
异或
与0异或不变,与1异或取反;a^a=0,自身异或,同为0
异或实现两数交换功能:
a=a^b;
b=a^b;
a=a^b;
位运算简单运用
去掉最后一位
x>>1
在最后加一个0
x<<1
在最后加一个1
(x<<1) | 1
把最后一位变成1
x|1
把最后一位变成0
(x|1)-1
最后一位取反
x^1
把右数第k位变成1
x|( 1<<(k-1) )
把右数第k位变成0
x&(~(1<<(k-1)))
右数第k位取反
x^(1<<(k-1))
例题:点名
一共n个学生,给出学号,找出没来的人。
一个人没来
思路1
加减互逆
先求总和,再依次减
思路2
位运算——异或的运用
相同的数经过两次(偶数次)异或抵消
两个人没来
先异或,结果中必然会有至少1个1,如果全0,说明两个数相同而学号必不可能重复。对于为1的结果,在这位上,没来的两个一个为0,一个为1;据此将所有学号分为两组,一组该位为0、一组为1;问题转化为为0组有一个没来;为1组有一个没来。
贪心
选择当前最好的,局部最优解=全局最优解
例题
n个整数数列{a},求 ai-aj (i<j)的最大值。
思路1
暴力求解,双重循环,枚举ai-aj
改进
要使得ai-aj的差值最小,则第一层循环可确定ai,只需在第二层循环中找出 i 后面所有数的最小值,ai-min=max,取值最大。
思路2(枚举加贪心)
开辟数组min[ i ],表示i及其后面所有数中的最小值。
递推公式
min[ i+1 ]=min( min[i],a[i] );
只需一层循环,max=max( ai-min[i+1],max );
例题:拼数
n个整数,连成一排,组成一个最大的多为整数。
常规思路
将整数作为字符串读入,两两比较排序,最后输出排序结果
。不能通过所有测试点!!
原因:a=233 b=2332331
a+b=2332332331
b+a=2332331233
显然,b字符串大,但连接结果 ab>ba;b在后面
所以,不是一 一比较数字字符串;
两两比较,判断连接顺序a、b
a+b>b+a ?