写到的有意思的题目
太有意思了这题
它的每一个数据
都像袁基的动作一样是精心设计过的。
题意就是:在一次操作中,您可以选择 i,j(1≤i,j≤n,它们可以相等)并设置 ai:=ai+aj(即将 aj加到 ai)。然后再限制范围内把整个a数组操作成非递减的。
它的基础操作是:
在全是正数或全是负数的情况下,那么通过类似前缀和和后缀和那样相邻的数一个加一个可以使得数列变成非递减。
证明是:
a[i+1]+=a[i];
a[i+1]>=a[i]
a[i]+a[i-1](原来)>=a[i]
a[i-1](原来)>=0
负数也同理也得,不过负数是从从后往前。
然后就得出了
花n-1步数可以解决掉全正或者全负的
总共要求31
n-1<=19
那么问题就变成了在12步以内把数列变成全正或者全负
那么我们要怎么转变呢。
这时候想到如果有一个绝对值是整个数组里最大的值,那么我们可以利用它加减,可以把那些不是我们想要的正负性的数字改变。
然后问题就成为了
操作出一个绝对值最大的值,并且用它操作与其正负性不同的数字
然后接下来的预估步数的部分就是我觉得很厉害的地方了
如果我们要全部转变成正数,我们用x来指代它。
如果我们要全部转变成负数,我们用y来指代它。
我们把操作出绝对值大于20的数的步数设为x1,然后把负数改变为正数的次数设x2。
同理设出y1,y2。
那么,因为一开始的原数组里已经会有一个绝对值最大的值,如果它是正数,那么正数就不用再操作出一个绝对值最大的数了,x1=0。然后就去把负数中的绝对值最大的值操作成整个数组中最大的。花费y1次,而y1<=5,因为2的5 次方已经大于20了。(题目中数据最大到20)
如果绝对值最大的数是负数也同理
所以(x1+y1)<=5
然后,就是求2的部分了
n<=20,所以x2+y2<=20,
所以(x1+y1+x2+y2)<=25
然后我们的题目是求min(x1+x2,y1+y2),
所以min(x1+x2,y1+y2)<=12,就正好在12以内了。
很妙。
数据的范围刚刚好。
以前一直都不太会估计时间复杂度和数据范围什么的,感觉这题给我带来不少收获。