Codeforces Round #204 (Div. 1)

本文解析了五道算法竞赛题目,包括贪心算法、动态规划、矩阵快速幂、分块优化及组合数学等核心概念的应用。每道题都详细阐述了解题思路,帮助读者掌握算法精髓。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

代码链接

A:

贪心。考虑一般情况(即每个数都有小数)题目要求的值即是所有的小数部分之和-n,但是由于有整数的存在,整数可以向上取整,也可以向下取整,因此若有x个整数,则有x个可选择的'1',借此来调整answer使其绝对值最小。

B:

显然跟逆序对有关,每次交换要么逆序对加1,要么减1。设 dp[i] 为逆序对数为i时的期望,则 dp[i] = dp[i-2]*0.5 + dp[i]*0.5 + 2,化简得 dp[i] = dp[i-2] + 4。边界 dp[0] = 0,dp[1] = 1。

C:

存在一组最优解,从0~任意位置的平衡不超过n(即左括号数量不大于右括号数量+n)。任意位置平衡不大于2*n是容易证明的,但是对于前面更强的结论表示不会证,但是这不妨碍正确性。

那么简单起见,假设平衡不超过x,则我们只需要求出从平衡a通过一段n序列转移到平衡b的代价,即是一个 x*x的矩阵T,求出T^m,(0,0) 即是answer。

D:

分块。题目给定的操作中,最后一步是将序列重排,那么显然可以在一步操作之后,通过将相同的数连续放置,来构造出只需要数种类数步数的方案,这个方案显然是最优的。主要需要处理的是第一步的选择,最好当然是第一步能消掉一种数,这样答案就是区间中数的种类数,否则答案是数的种类数+1。因此需要知道区间里存不存在一种数,它在区间里的所有下标能构成等差数列。为每一种数维护一个双端队列,该种数能构成等差序列当且仅当队列中相邻两数的差值只有1种,也就是相邻三个数的构成的两根线段长度相等,借此可判断该数能不能构成等差数列。设当前区间为 [l,r],转移到 [l,r+1] 时,就在 a[r+1] 对应的deque尾部插入 r+1,并且判断deque[a[r+1]]的等差性质是否改变,其他转移同理,注意细节。用分块实现。

E:

先对所有数取绝对值。对于当前最大的数x,显然小于x的数的决策都不影响他们与x的相对关系。那么先假设所有数都不相等,从大到小开始考虑:当x取正时,x 与右边比它小的数构成逆序对,当x取负时,x 与左边比它小的数构成逆序对,这个贪心就可以了。由于题目中存在相等的数,并且这些相等的数的决策是相互影响的,那么可以dp一下,设状态为前i个数,有j个选正号,下的最小逆序对数。于是题目的解法就很清晰了:从大到小决策,对相等的数dp求解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值