题外话 第一次写题解,有点小激动
题意
给你 n 个数,让你做若干次操作:将任意相邻两数取相反数。求最后和的最大值。
相反数
简单来说,就是正数变负数,负数变正数,比如 6取相反数=-6,-10取相反数=10
思路
先看这个例子(n=6):
1 -1 -1 1 1 1
显然答案为6。
再看这个:
1 -1 1 1 1 -1
答案还是6,但是为什么呢?
操作如下:
· 1 1 -1 1 1 -1 (操作(2,3))
· 1 1 1 -1 1 -1 (操作(3,4))
· 1 1 1 1 -1 -1 (操作(4,5))
· 1 1 1 1 1 1 (操作(5,6))
我们可以发现,负号通过向右转移,转移到另一个负号前,然后一起消灭。
于是我们可以理解为:对于每次操作,将任意两数取相反数。
所以:当负数个数为偶数时,我们可以全部消灭。
那么为奇数呢?
我们可以把最大的那几个负数消灭,剩下一个放着让他拖后腿。
这样对吗?
看这一组(n=6):
-10 -10 -10 -10 -10 1
按照上面一个思路,答案是 4*10+1-10=31。
而正确解法是把(1,2),(3,4),(5,6)操作,答案是 10*5-1=49。
这个hack提醒我们,可以把正数拉过来当替死鬼。
总结
如果负数个数为偶,直接把所有负数变正数。
如果为奇,先把所有负数变正数,再找出绝对值最小的,把它变负数,实现了答 案最大化。
你们学废了吗?感谢观看