文章目录
Codeforces Round #651 (Div. 2)
A. Maximum GCD
题意: 给定n,找到1 < a < b <= n,使得gcd(a, b)最大
题解: 思维+数学。分析可知,找到的a和b,必然成倍数关系,b = t * a,那么 res = gcd(a, b) = a。就是找到一个数字是另外一个的倍数。那么最大的就是 ⌊ n / 2 ⌋ \lfloor n / 2\rfloor ⌊n/2⌋,因为t取2能够使得a最大
代码:
B. GCD Compression
题意: 给你2n个数字,从中选择2 * (n-1)个数字,然后两两组成一对,记每一对的何为bi,要求使得这n-1对的gcd大于1.
题解: 思维+构造。gcd大于1,那么只需要全部为偶数即可,那么我们就把奇数和偶数分别拆分出来,然后拿的时候要不然2个都偶数,要不然2个都为奇数,这样就能够使得b全为偶数。那我们先从偶数开始拿,能拿就拿,如果最后偶数剩下一个,那么最后奇数也会剩下一个,刚好一起扔掉;如果偶数不剩下,那么奇数最后2个扔掉就行。
代码:
C. Number Game
题意: 给定n,每次操作可以进行如下:
- 将n除以奇数因子
- n–
操作要保证n>1才能进行,不能进行操作的输
题解: 博弈。考虑分为奇数偶数。如果n为奇数,那么我直接除以自己,然后就赢了,因此拿到n为奇数的局面为赢。如果n为偶数,那么我是可以将偶数转换为奇数,或者不能转换的。将n分解为 n = 2 t ∗ a ∗ b . . . n = 2^t * a * b... n=2t∗a∗b...,那么如果a*b不存在,就是能转换,要不然就是不能转换。如果能够转换,那么我就变为 2 t ∗ a 2 ^ t * a 2t∗a给对面。
代码:
D. Odd-Even Subsequence
题意: 给定一个长度为n的字符串s,要求从s中找到一个长度为k的子序列,要求子序列的奇数位的最大值或者偶数位的最大值最小。
题解: 二分+思维。如果不说奇数位偶数位,那么我直接二次答案,然后check的时候,如果小于等于mid就选,这样贪心选择k个即可。现在要求奇数位和偶数位的最大值最小,那么check的时候分开奇数位和偶数位check。只需要奇数位满足或者偶数位满足即可。
代码:
E. Binary Subsequence Rotation
题意: 给定一个是字符串s和一个字符串t,每次操作可以选择s中的随机个子序列,然后将其循环右移,问最小多少次操作可以使得s变为t。
题解: 思维+贪心。分析可以知道s选择出来的子序列为010101,或则101010,且长度为偶数。因为如果不是这样的结构,比如011,那么循环移位后为101,最后一个1其实没有移动过,没有意义,同理其他00连续或者11连续也是一样。然后如果不是偶数,那么比如010,循环后为001,也会出现无效位。所有证明只能01交错且长度为偶数。
贪心考虑这个问题,那么我从前往后扫描,如果返现s[i] != t[i],我就需要判断这个字符该怎么处理,我就维护许多的分组,每个分组尽可能形成0101,或则1010。这样维护了多少个分组就是需要移动多少次。
代码: