【atcoder】 tenka1_2018_c

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 。。。。

。。(所以通过了大部分。。。而已啊)好了还是要找,规律,

以后如果要写题的话,当天解决,不然又都忘了。不放代码了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值