Insert and Equalize

这道题目为什么赛时做了40min呢?为啥呢?我寻思着猜也能猜出来吧

主要原因:没有认真的写式子,写代码不认真,还没有认真地估计时间复杂度导致T了一次。以后要想清楚再写啊!

但是赛时还是用猜的吧,看看样例,估下时间复杂度就知道直接用gcd就好了(不然肯定TLE了)

真正的证明感觉难度都有蓝了

我们先对a进行排序(只对[1,n]排序,下文的an+1都指代新加入的数,不一定是最大数),肯定不会影响答案

首先我们写出一个连等式,a1+t1x=a2+t2x=...=an+tnx=an+1+tn+1x

这种式子,一个很常见的技巧就是对x取模,于是a1a2...anan+1 (mod x)

作差有0a2a1...anan1an+1an (mod x)

可知x一定是相邻两项差的公约数

如果我们加入的an+1是序列的最大数,那么我们让所有数都变成an+1肯定是最优的,有ans=i=1nan+1aix=nan+1sumx,其中sum=i=1nai

如果我们加入的数不是最大数,那么最大数还是an,答案就是ans=i=1n1anaix+anan+1x=(n+1)ansuman+1x

我们再来考虑一下没有加入an+1的时候的答案,为ans=nansumx

显然当x为最大公约数d的时候ans最小

所以我们猜测当我们加入的数不是最大数的时候,也是xd的时候ans最小

证明:当x=d时,有ansnansumd+n(因为此时an+1一定为an+kd,其中k为负整数;由于an+1没有出现过,当t1,t2,...,tn取遍[0,n1]时,an+1的贡献就是n,所以是加上n);当xd时,xd2(有结论:公约数一定是最大公约数的约数),则ans2×nansumd+anan+1x;要证ans(n+1)ansuman+1d,即证2×nansumd+anan+1xnansumd+n,即nansumd+anan+1xn;由于xanan+1(注意x是包括an+1在内的相邻两项的差,自然也就小于an+1),故nansumd+anan+1xnansumd+1n(n1)2+1;故即证n(n1)2+1n,当n2时显然成立

我们也可以证明当加入的数是最大数的时候是不会更优的,这个比较简单,就不写了

update 2024.7.14

重新做一遍这道题目,还是做出来了

看到这道题目首先从an+1下手,但是发现不太好做,然而题目除了an+1这个对象还有x这个对象,于是从x开始下手,然后不难得出上面的结论(注意结论是充要的,也就是说如果x是相邻两项差的最大公约数的约数,那么一定符合条件),然后加入的an+1一定是小于an的,这个稍微想一下就想出来了(注意如果x定了,an+1一定是an加减x的若干倍所得到的数);至于猜xd,从样例入手就好了

update 2024.8.5

想出来一种比较简单的证明。首先当x=d时,所有的ti都取到了最小值,x一旦减小,每个ti至少加一,所以所有ti至少增加n1,而对于tn+1,顶多从n变成1,所以答案不会更劣

posted @   最爱丁珰  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示