B. Trouble Sort
题意:给你一个大小为n的数组,有俩种类型的元素,一种为0,一种为1,现在你可以操作任意次数 : 当俩个的种类不同时,我们可以交换他们,现在问:能否有办法,使得这个数组呈递增序列排序。
思路:当存在两种元素时,可以借助另一种元素使得此种元素某两个交换,则可通过交换排序解决,
AC代码:https://codeforces.com/contest/1365/submission/152461695
C. Element Extermination
题意:如果a[i]<a[i+1],那么可以消除掉a[i]或a[i+1]中的任意一个,给你一个数组,问其最后能不能被消除到只剩一个元素
题解:Codeforces Global Round 9 C. Element Extermination (1400)
AC代码:https://codeforces.com/contest/1375/submission/152464188
D. Binary String To Subsequences
题意:给你一个01字符串,计算拆分成若干01交替序列的最小拆分个数。
思路:和子序列长度无关,那可以用类似链表的思想,用两个容器存子序列末端为 0 或 1 的下标,不断拼接、放入即可。
AC代码:https://codeforces.com/contest/1399/submission/152465009
C. Circle of Monsters
题意:给你一个环,环中有 n n n 个怪兽,每一只怪兽有 a i a_i ai 的血,然后你有无限子弹,一颗子弹扣除 1 滴血,当你杀死一只怪兽的时候,它会对下一个造成 b i b_i bi 的伤害,问子弹最少消耗个数。
题解:Codeforces Circle of Monsters(思维)
思路:贪心。我们要尽量利用怪兽爆炸产生的伤害, n n n 个怪兽中最多受到 n − 1 n-1 n−1 次爆炸伤害,那我们就枚举第一个死亡的怪兽,然后顺次去攻击怪兽,计算子弹数量取最小即可。
AC代码:https://codeforces.com/contest/1334/submission/152469436
D. Another Problem About Dividing Numbers
题意:给定 a , b , k a,b,k a,b,k , 在每一回合中,可以将 a a a 或 b b b 除以 c ( c > 1 ) c (c > 1) c(c>1)。问是否可以在恰好的 k k k 回合中使得 a = b a=b a=b。
思路:首先,共同终点肯定是
a
,
b
a,b
a,b 的最大公倍数的某个因数。我们先计算
a
,
b
a,b
a,b 到最大公倍数的回合数的上下限:下限就是
(
a
!
=
g
c
d
)
+
(
b
!
=
g
c
d
)
(a!=gcd)+(b!=gcd)
(a!=gcd)+(b!=gcd),上限就是
a
/
g
c
d
a/gcd
a/gcd 的质因数个数 +
b
/
g
c
d
b/gcd
b/gcd 的质因数个数,判断
k
k
k 是否在这个范围内。
如果不在范围内,我们再计算跳到最大公倍数的某个因数的上下限:下限就是 2 ,上限就是上一步的上限 + 2 *
g
c
d
gcd
gcd 的质因数个数,再判断是否在范围内。
有个重要的常数优化:筛质因数个数的时候,可以提前筛出质数,这样可以把时间复杂度从
O
(
n
)
O(\sqrt n)
O(n) 降到
O
(
n
ln
n
)
O(\frac {\sqrt n}{\ln {\sqrt n}})
O(lnnn)。靠这个优化成功过了这道题(702 ms / 2000 ms)
AC代码:https://codeforces.com/contest/1538/submission/152471907