每日总结2021.4.22

1.cf AGAGA XOOORRR (大意:给定一个长度为n的数组,每次删除两个相邻的元素,在他们原位置添上他们的异或值,问是否能生成所有元素都相等的情况,最少留有两个元素。(思路:自己陷入了从后往前推的误区,出不来了。但是,注意到每次删除相邻的,总有前面连续的一段形成最后的x,所以只需枚举第一段连续的长度,确定最后的x,看能不能构成就行了,注意,最少保有两个元素,所以只能到n-1。)

(更加简洁的思路,当然,总的异或值为0,则一定可以。总的异或值不为0,如果可以输出YES,最后最多剩三个,因为再多的就可以合并)所以最多只需要考虑三段,判断方法:可以预处理出前缀,将其划分为三段,如果可以等就是YES)

总之反向思考有时候总能达到出其不意的效果,但当时没做出原因:一方面A题搞了心态,另一方面没有想出“最后最多三个,多了就可以合并“这个关键点,一旦想到自然可以想出最多划分三段,进而记录前缀。

2.cf Baby Ehab Partitions Again 思维好题,解锁背包新用法

大意:给你一个长度为n 的序列 a,问你可不可以删除最少的元素个数,使得任意分成两组,这两组各自的和都不相等(可以不删除),输出删除的最少的元素个数,和要删除的下标。n不超过100

思路:先来想想什么情况下可以不删除? 很容易想到,如果原序列和为奇数的话,任意分两组必定都是不相等的两组。但和为偶数的时候的呢?因为和 s 是偶数,我们只需看其中一组能不能凑够是s/2就行了,不妨令m=s/2。接下来我们可以用01背包来判定。为什么呢?先让我们来想想01背包是用来干嘛的? 在不超过背包容量,每种商品最多取一次的前提下可以取到商品的最大价值!!!将本题代入01背包:即背包容量为m,求不超过m的选择方案的最大值,因为每个商品 体积==价值,总体积不超过背包容量m,所以选择的方案中的最大价值<=m,所以就可以用01背包来判断能不能凑成,即该最大价值是否和m相等。如果不等,即最大的都不等了,那凑不出了,所以就不用删。反之就是能凑出来,接下来进行下一步。

因为和是偶数。如果序列有奇数的话,删除这个奇数的话,和就变成奇数了,就不能分成相等的两组了。

但如果没有奇数呢?那简单,你们都是偶数,那我把你们都除以2不过分吧,因为你们到时候是看分组后的和嘛,除以2之后对你们又没什么影响。还没有奇数怎么办,那我再出一下再除一下不过分吧…还没有?我… 得,您被别除了,给您个奇数行了吧…

完毕。

总结((1)可以用01背包模型来判断序列能否凑出和为某个数的问题(2)全是偶数时除以2的思想真的巧妙)

3.AcWing 167. 木棒(dfs剪枝)(题目大意:给n个小木棍,问能拼成若干根长度相等的长木棒的最小长度)dfs剪枝经典题目,(1)最明显的一个优化:长木棒的长度是所有小木棒长度和的约数,(2)优化搜索顺序:将小木棍从大到小排序(3)排除等效冗余:通过木棍的编号排除等效冗余,即按顺序枚举,小号在前,大号在后。(4)可行性剪枝,在每次拼的时候,如果放第一根木棍失败了,就直接返回,原因:因为失败了嘛,你后面总要把这根木棍放在第一个位置,还是失败。(5)如果在某个位置放某个木棍失败了,则跳过所有与他长度相同的木棍,很容易想到,你放失败了,和他长度一样的也肯定失败嘛,(6)如果在放最后一根木棍失败了,直接返回失败,原因:你最后的一个位置放失败了,则说明这种排列方式不正确嘛,所以直接认定失败。

4.洛谷1092 [NOIP2004 提高组] 虫食算 (题目大意用给定一个正整数n,表示两个加数与和的位数是n,进行n进制的加法运算,但是是不出现数组的,用大写字母表示数字,每种字母代表0~9的一种数字,c从A开始n个字母,每个至少出现一次,输出:从A开始按顺序输出n个字母代表的数字,只有一种合法满足运算的合法方案)

思路:第一种搜索方式:按照字母搜索,搜索顺序不太好想,但代码量少。首先最简单明了的思路,直接爆搜每种字母代表的数字,最坏情况 26! 铁定超时。这时候就要想剪枝了。(1)类比 10进制的某一位 (A+B)%10=C或(A+B+1)%10=C(有进位),所以对于n进制 也应存在对于每一位有(A+B)%n=C或(A+B+1)%n=C 如果不满足,则返回,(2)最高位A+B<n,即不能进位,最高位一旦进位就超过n位了。所以基于此,按位来搜索。(3)搜索顺序的优化:因为字母出现顺序是乱的,如果直接按从A开始的顺序搜索可能会出现无效搜索,即加法的低位还没有确定。因为要考虑进位问题,只能从低位开始判断运算是否合法,但是呢,如果不先把低位上字母代表的数字给确定,肯定就会判定不合法,所以较好的搜索顺序就是从低位到高位按照字母出现的顺序来确定的数字。先把低位低位字母代表的数字给确定。(4)确定数字的时候从大到小枚举,因为最高位之和不能超过n,所以尽量小的数字在前。

第二种搜索方式:按从低位向高位,从上向下一个个搜索,简单容易想,但代码量大,较复杂。

剪枝策略大同小异。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值