1、前言
NOIP前互测题第一弹——来自hcy的贪心专题。因为我考试前一天晚上手贱(真的算手贱吗)去BZOJ上刷题然后碰巧那道题就是今天的考试题,结果碰巧又被hcy注意到了。。。其实本来我无意去知道的。。结果就这样莫名其妙地A了。贪心什么的感觉还好,另外一道题以前做过,对于“三分”这个概念我印象还很深。
2、Lawnmower 割草机
大概题意:在n*m的0-1矩形中,从左上角(0,0)出发,每次只能朝两个方向移动——下,左或右。若当前行i为2的余数则向右,否则向右。求用最短路经过所有1的点。
总结:只有60分,怪我没有把题目看清啊。因为只需要经过所有1的点,所以如果最后几行没有1的话,就不需要走到后面几行去了,这个地方需要特判一下。
题解:贪心。首先假设每一行都一定有1,那么我们先求出每一行的最左端的1的位置和最右端的1的位置。因为要求必须走类似于“S”型的路,那么对于偶数行,横向距离为从当前位置走到当前行和下一行最右端的较大值,然后向下移动一格;奇数行反之,从当前位置走到当前行和下一行最左端的较小值,然后向下移动一格。
3、Price 定价(BZOJ 4029)
链接:
4、Food 外卖(BZOJ 3874)
链接:
5、XOR XOR游戏
大概题意:给出n个数,每次可以选出两个数相异或,并赋值给其中一个,可以异或无数次,求n个数最大和。
题解:
我们可以用这n个数互相XOR直到每个数不能在变小(即变为极小值)(解决方法:贪心思想,先把每个数的最高位的位数变成不同的,然后通过最高位比较低的向量,把最高位高的数弄成极小。),然后我们可以用其他数将第一个XOR成极大值。(可以发现:1:极小值中,二进制数最高位为第i位的有且只有一个,与线性基相似。(否则可以用两个数XOR,变为两个更小的值)2:所得极大值一定是整个序列的最大值,可以发现,所有值化为极小值后,若二进制数最高位为第i位的数存在,那么二进制最高位大于i的数在第i位一定为0,也就是说所有非0值异或即可得XOR极大值)。
可以发现:最后用极大值 XOR 其他极小值所获得的序列是一个可行的序列。
证明所得每个解为最大:
取第i个极小值与第一个XOR,设得到s,假设还可以获得一个更大的值,那么肯定会在XOR另一个极小值b。设b的二进制最高位为j,那么s在第j位的值一定为0。(否则不会更优)易知:第一个极大值在第j位一定是1.而s第j位为0,那么可知第i个极小值的第j位为1(1^1 = 0)。发现这是不合法的。(这样第i个极小值^b可以变的更小,与其为极小值不符)。复杂度:O(n^2)。