ACM算法训练——枚举与贪心3

枚举与贪心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 ?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值