思路
这道题是个贪心。
要把个袜子分成
双。要求每双袜子的差的总和最小。
贪心的策略很容易,就是把没有缺的袜子按同样颜色配对,而缺的袜子,就就近两两分组。
证明
所有的贪心思想都需要得到证明。
对于这种思想,可以把每只袜子放到一个坐标轴上,点就表示第
双袜子,其颜色为
对于样例1的构造。
图中绿色的线段为两只不同颜色的袜子。红色的点表示没有被匹配的点。
对于另一组手造样例
7 4
1 2 4 7
使用此方法的构造
最终发现,这种贪心方式与看似更优的“就近匹配”得到相同的结果。
当为奇数时,也需要用前缀、后缀和的方式进行排除。
对于数组,记
为前
项进行两两相减的和,
为
项以后进行两两相减的和。
最后枚举每个,求
的最小值。
代码
对于奇数项的筛选:
for(int i = 2;i <= k;i += 2){
pre[i] = pre[i - 2] + (a[i] - a[i - 1]);
}
for(int i = k - 1;i >= 1;i -= 2){
suf[i] = suf[i + 2] + (a[i + 1] - a[i]);
}
if(k % 2 == 0) ans = pre[k];
else if(k < 2) ans = 0;
else{
for(int i = 1;i <= k;i += 2){
ans = min(ans,pre[i - 1] + suf[i + 1]);
}
}