CF1375题解

CF评分2693,豆瓣拒绝评分,这套题啥实力就不用说了

CF1375A

被爆切了(悲,md想了20分钟没有想出来,然后就看了一眼题解,wc这不直接一正一负就解决了吗。。。

脑子不转了

CF1375B

切了,首先有一组必然合法的解,就是把所有数都变为大于0的数,这样必然是最大的解,若 a[i] 还有比这组解大的就必然不合法

CF1375C

差一点,少考虑了一点

我们观察首先 a[n] 只能由比它小的数消掉并且他还是最后一个数,所以最一次消除操作右边的数一定小于等于 a[n],因为我们贪心的要让右边的数尽可能的大,所以最终右边的数是 a[n] 是最优的

我们再次观察 a[1] 只能由比它大的数消去,并且它还是最左边的数,所以同理,最后一次消除操作左边的数一定大于等于 a[1] ,我们贪心的让左边的数尽可能的小,所以最终左边的数是 a[1] 是最优的

所以只需要考虑最后一次操作,也就是若 a[1]<a[n] 则成立,否则不成立

若有人说中间的数怎么办,考虑因为 a[1]<a[n],所以比 a[1] 小的数一定能被 a[n] 消掉,所以比 a[n] 小的数一定能被 a[1] 消掉,证毕

CF1375D

构造题,挺好玩的

这种题的思路就是无论你给我的输入是什么样的,我就给你一种合法的解,一招治百变

首先,我们想到最后可以把排列变成 0~n-1,考虑怎么做呢?

如果初始的排列中的数本身就没有重复的,且值域在 [0,n1] 显然是好做的,我们找到一个不对应的数,然后将这个数先经过一步跳到n,此时这个数就空出来了,我们把应该填这一个数的位置再进行一次操作,把它变成正确的,然后又空出来另一个数,然后继续进行操作,最后形成了一个环回到了原来的位置,操作次数是环的大小+1

然后我们考虑如果原数列是有重复的呢,我们可以先把一个有重复的数进行一次操作变成没有重复的数,考虑最多所有数都是n,最多进行n次操作

把两个操作组合起来,就是通解了

欸但是,你会发现第一个操作最多是n次,第二次操作是环长+1,这个数不保证小于 2n 的怎么办?

考虑这样一件事情,第一次操作如果是n次,那么必然所有数都是n,我们把第一个操作跑完后本身序列就是合法的

那么另一种情况呢,比如全是0,那我们第一次操作就会进行n-1次,但是我们会发现我们第一种方式最多形成一个环,所以第二种操作是n+1次,也合法

一般的,我们我们设原数列给出了k个不相同的数(且不为n),所以第一次操作就会进行 nk 次,然而只有给出的数才会构成不同的环,这样第二次操作最多有 n+k 次,可以保证在 2n 次内解决

posted @   daydreamer_zcxnb  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示