写在前面:
预期G题,H题都应该能过10-20个人,没想到最后G无人通过,H题仅仅通过五人。
还是希望大家好好加油吧!算法竞赛的路还很长,需要热情和努力。
G题 :题面如图所示


思路:
仔细阅读题目,发现无非就是求max(a[i] + a[j]),并且保证到俩端点的距离之和不超过k,注意这里第二件珠宝可以不卖,所以这里的a[j]需要和0取max。
由此不难想到我们的第一个思路:
枚举第一件珠宝在哪一天卖出,从而得到了第二件珠宝可以在哪些天卖出的区间。
自然我们只需要在这个区间里面的最大值,与第一天卖出的值相加即可得到备选答案,所有备选答案的最大值即为最终答案。
好了,敲完代码恭喜你得到38分TLE(时间超限)。
但是如果你赛时能拿到38分已经很棒了,因为你可能不清楚计算机1s能跑多少指令,或者其他种种。
为什么呢?因为这里k很大,导致我们在枚举第一天后再去枚举求区间里的最大值,时间复杂度为O(k^2),大概是10^10,在这里给新生们普及一下,计算机1s最多跑 2*10^8 - 4*10^8。
冷静下来想一想怎么优化。首先,枚举第一天肯定省不了了,不枚举的话我怎么得到第二件卖出的时间区间呢?
枚举求这个区间里的最大值,每次都要枚举一遍是不是有点冗余呢?
在第一天,我枚举求了 a[n - k] a[n - k +1] ... a[n] 的最大值。
在第二天,我又要枚举 a[n - k + 1] ... a[n] 的最大值。
欸,好像如果我知道了第二天的最大值,我只需要和a[n-k]取max就知道了第一天的最大值。这样就不需要再重复一一枚举了。
于是你从第k + 1天开始枚举,注意考虑 k+1 > n会越界的问题。
倒着往前面枚举,并用一个变量记录当前区间的最大值,每次和前面那个数取最大值,得到最新区间的最大值。简单对答案取一个max,记得输出的时候带换行。
好的,现在你写完了这道“无人通过”的题,但是他真没你想的那么难吧。
代码就不放了,有兴趣的可以去校oj写哦。
H题,题面如图所示


读完题,显然题面很有趣。
拿出本子想一想具体情况。
n = 2。好的,需要俩次。
n = 3。提示里有了,需要2次。
n = 4。耐心写写画画,发现 2332 好像一定可以,暂定为4次。
n = 5。好像有点复杂。不妨套用4的方法,234432,想想我是狐狸应该怎么躲。想不出来,暂定为6次吧。
n = 6。更复杂了,不管了先套用4的方法,23455432,我是狐狸,咋躲啊,我靠,躲不了!
那那那
2 3 4 5 ... n - 1 再从 n - 1 n - 2 ... 3 2 ,这不是2 * (n - 2) 吗?
然后 2 的时候我特判一下,提交!不出意料,过了!
你说,是不是分给H题1个小时,怎么都能想出来?
好的,作为出题人,给出证明:
首先为什么一定能抓到呢?不难发现,我们从 2 抓到 n-1, 狐狸此时如果在右侧只有可能在 n, 这时候再抓一次 n - 1, 狐狸一定不可能在右侧了,而且狐狸也一定不可能在 n - 2 。为什么呢,这里大家可以自行思考一下。所以再抓 n - 2, 狐狸不可能错开跳到 n - 1。这时候再扫到2,自然就一定可以抓到狐狸。
其次为什么是最短的呢?
不妨令x属于[2,n-1]
考虑对于一种合法方案,x的出现次数不妨设为d
若d = 0, 显然可以通过用 x x-1 x+1构造出hack躲避方案
对于 d = 1, 类似 ???x?? 的合法方案
也一定可以通过x x-1 x+1构造出躲避方案。
所以长度至少为 2*(n - 2) 。
592



被折叠的 条评论
为什么被折叠?



