【4.2】Codeforces 刷题

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 n1 次爆炸伤害,那我们就枚举第一个死亡的怪兽,然后顺次去攻击怪兽,计算子弹数量取最小即可。

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(lnn n )。靠这个优化成功过了这道题(702 ms / 2000 ms)

AC代码:https://codeforces.com/contest/1538/submission/152471907

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值