题意:
检验是否有大于1的奇数除数。
题解:
除了2的整数次幂,都是合法答案。
所以不断把除2,看看是否能遇到奇数即可。
时间复杂度。
题意:
询问是否可以化成若干个2020和若干个2021的和。
题解:
贪心的做法是先把分成尽可能多的2020,分不了的数给已经被分配的2020,让它们中的一部分变成2021。
所以可以设,。
当的时候,就一定有解。
时间复杂度。
题意:
给出来参加舞会的男生和女生的人数,然后给出对必须在一起跳舞的夫妇。
现在请你必须选出2对来跳舞,但是不能有一个男生都在2对中,或者一个女生都在2对中。
询问有多少种选择方法。
题解:
给出的男生和女生人数其实是没啥用的。
考虑枚举单独选择每一对的情况,假设我们当前枚举的是第对,那么与第对能凑成组合的只可能是不包含这一对的男生和女生的对。
这样我们就可以先预处理出每个男生参加了多少对,每个女生参加了多少对。
然后枚举每一对。
假设我们当前枚举的这一对,男生叫,女生叫,那么可以与这一对一起选的对数就是
为什么最后要加一,因为之前的减法把这一对本身也算进去了。
时间复杂度。
题意:
给出个手机应用,它们每个占用一定的内存,删除它们自身需要花费费用。
只可能是1或2。
现在想删除至少个内存的应用,询问怎么删使得总费用最少。
题解:
注意到只可能是或这个条件。
首先考虑本题的弱化版本:
每个手机应用占用的费用都一样,怎么删使得总费用最少。
那肯定是删除最少的应用费用最少。所以就把所有应用从大到小排个序,然后从前往后枚举,一旦总内存大于了就停止,这样费用一定是最少的。
再回到这个问题。
当删除花费1的应用数量固定时,删除花费2的应用的数量也固定。
考虑这个思路:
对花费1和花费2的应用分两个数组存,分别从大到小排序。然后枚举删除花费1的应用的数量的方案,取最优解。
那么怎么对每个方案取删除花费2的应用的方案数呢?
考虑先预处理花费2的数组的前缀和,转化为对花费2的数组的前缀和数组取1个最小的下标使得总内存大于等于。
前缀和数组具有单调性,这一步可以二分。
所以枚举+二分顺利通过此题。
时间复杂度。
题意:
给出一个数组,可以选择其中的个数字。
询问选择数字和的方案数最大有多少种。
题解:
首先我们将数组排序,取前个最大的,作为一种方案。
其他方案的种数只和数组里有多少个和第个数一样的数有关。
假设前个里有个和第个数一样,整个数组里有个和第个数一样。
问题就转化为在个一样的数里选个有多少种选法。
那就是简单的排列组合问题了。求组合数可以暴力也可以卢卡斯。
题意:
给出2个01矩阵和。
支持2种操作:
垂直异或:取里的一列元素异或1。
水平异或:取里的一行元素异或1。
询问是否可以异或使得变成。
题解:
对于一个元素来说,想让他发生变化,所在的行和列必须有一个作奇数次。
对于一行来说:
如果它作奇数次,那么这一行上面不同的元素所在的列必定作偶数次。
如果它作偶数次,那么这一行上面不同的元素所在的行必定作奇数次。
可以把每一行每一列操作奇数次、偶数次单独作为点建图,然后并查集,看是不是有一个连通块包含2n个点。
可以证明同一行不会合并。
时间复杂度。
题意:
一个漂亮数组被定义为:数组里的元素两两之间可以被整除。
询问数组删除的最少元素,使得剩下的元素组成的数组是漂亮数组。
题解:
先将数组从小到大排序。
然后从前往后枚举,定义状态为以元素结尾的漂亮序列的最大长度。
对于里的每个元素,只需要枚举的所有因子的状态,取最大的+1,就是以结尾的最优解。