https://tenka1-2018-beginner.contest.atcoder.jp/tasks/tenka1_2018_c
其实就是从小到大排序,解决了正向的问题,还要再反着搞一遍。
其根本原因在于这样排列使得左边浪费一个,右边浪费一个。使得浪费最小
最开始想的是直接跳着头插入进去。会wa在奇怪的点,zj说正面来一次,再反面来就好,解决了头重脚轻的问题,还要顾及头轻脚重。
正确一点的方法是,
官方:
假设在重新排列序列后,我们得到p1,...,pN。 我们可以假设没有i满足pi-1 <pi <pi + 1或pi-1> pi> pi + 1。如果我存在, 我们可以将pi移动到序列的末尾,绝对差值之和永远不会减少。 (如果这 操作导致在序列结束时新增加(或减少)三个连续元素, 再次交换最后两个元素。) 因此,有两种情况: •p1≥p2≤p3≥...... •p1≤p2≥p3≤...... (严格来说,还有一些其他的情况,比如p1 <p2 = p3> p4,但是我们可以用它来消除它们 与上述相同的观察结果)。 由于这两种情况是对称的,让我们描述第一种情况。我们希望最大化价值 (p1-p2)+(p3-p2)+(p3-p4)+(p5-p4)+ ....这里,我们可以忘记约束p1≥p2≤p3≥... 因为当这种情况不能保持时,价值永远不会成为最大值。 例如,当n = 5时,(p1-p2)+(p3-p2)+(p3-p4)+(p5-p4)=(+1)* p1 +(-2)* p2 + (+2)* p3 +( - 2)* p4 +(+1)* p5。为了达到最大值,我们应该将最大的元素分配给 系数最大的位置。因此,按元素的递减顺序,我们应该将它们分配给 按顺序排列第3,1,5,2,4。 对于一般的n,我们可以以类似的方式计算系数,对它们进行排序,并分配最大的元素 到系数最大的位置。
---------------------
原文:https://blog.csdn.net/sdz20172133/article/details/83474800
其实啊,真的理解写出公式来很好了。。。
打败我的样例是1 1 8
若小的放在中间,就是先1 再围攻 1 [1] 8
若其他情况,则为5 1 8 ..等等
第一种情况:
(p1-p2)+(p3-p2)+(p3-p4)+(p5-p4)
系数:
n=5:1 -2 2 -2 1
n=6:1 -2 2 -2 2 -1
第二种情况:
(p2-p1)+(p2-p3)+(p4-p3)+(p4-p5)
n=5:-1 2 -2 2 -1
n=6:-1 2 -2 2 -2 1
---------------------
(这里的是x 几个x.. 其实和我的意思是一样的 QAQ 只是样例可能会给你一种错误引导)
肯定是间或交叉的最划算 只是是1 9 2 7 4的问题呢? 还是9 1 6 2 5的问题这样
追根溯源到原理的式子里会发现.. 哪个都不是鸭 为什么会先把1放中间... 因为1不能放边上
边上的放谁呢.... 这不一定的
看权值 剩下的放在边上咯 如果最后中间是8, 中间最大不能放边上咯 就用到大的视角再算了
emmmm..... 【因为你所说的特例,不是next_permutation就能解决的情况】
[说不定就拿3个来说, 1 8 8 和1 1 8 就是不同的结果呀!]
====然后我发现我的方法reserve一下还是错的,所以以链接中的那个方法为准
n=5:1 -2 2 -2 1
就直接,-2从大到小给,2从小到大给
或者2从大到小给,2从小到大给
剩下的直接+1 (首个都是一样的)
如果是偶数就-1
总之,公式解决,清楚又方便(关键是清楚了不会递增递减而是交替)
可能是这里有问题,我的方法是严格的-2 2 -2 2 -2 1 。。。。
。。(所以通过了大部分。。。而已啊)好了还是要找,规律,
以后如果要写题的话,当天解决,不然又都忘了。不放代码了