ABC334C Socks 2 题解

文章讲述了在配对袜子时,利用贪心算法将没有缺失的袜子按颜色配对,缺失的袜子则尽可能找到颜色相近的配对,证明了这种方法与最优解等效。对于奇数数量的袜子,通过计算前缀和后缀和来确定最佳配对方案。
摘要由CSDN通过智能技术生成

My Blog


思路


这道题是个贪心。  
要把2n-k个袜子分成\lfloor \frac{2n-k}{2} \rfloor双。要求每双袜子的差的总和最小。  
贪心的策略很容易,就是把没有缺的袜子按同样颜色配对,而缺的袜子,就就近两两分组。


证明


所有的贪心思想都需要得到证明。   
对于这种思想,可以把每只袜子放到一个坐标轴上,点(a_i,i)就表示第i双袜子,其颜色为a_i


对于样例1的构造。   
图中绿色的线段为两只不同颜色的袜子。红色的点表示没有被匹配的点。
对于另一组手造样例
 

7 4
1 2 4 7


使用此方法的构造  



最终发现,这种贪心方式与看似更优的“就近匹配”得到相同的结果。

 


\frac{2n-k}{2}为奇数时,也需要用前缀、后缀和的方式进行排除。  
对于数组A,记p_i(2|i)为前i项进行两两相减的和,s_i(2|i)i项以后进行两两相减的和。  
最后枚举每个i(i\not|2),求p_{i-1}+s_{i+1}的最小值。

代码


对于奇数项的筛选:

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]);
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值