ABC 334 C - Socks 2

题目大意:

        现在给k个数两两配对,将差异度定义为配对的两个数之差,求配对后差异度和的最小值。如果K 是奇数,配对后可剩余一个数不算入差异度的计算中。

题目思路:

        我的思路是进行差分算法

        我们需要判断k是偶数和k是奇数时的情况。

        如果k是偶数,那么我们只需要计算每个相邻元素之间的差值并输出即可。如果k是奇数,那么我们需要进行一些特殊处理。

        我们需要初始化两个数组,分别是sl和sr。sl数组存储的是从a[2]到a[k]之间的差值,而sr数组存储的是从a[1]到a[k-1]之间的差值。

        接下来,我们需要遍历sl和sr数组,并计算当前元素之间的差值。我们需要使用sl[i-1]和sr[i+1]来计算当前元素之间的差值。

        最后,我们需要输出最小的差值。

        注:N在这道题中没有作用。

              输入的a[i]是有序的。

题目代码:

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+9;
int a[N],sr[N],sl[N],n,k;
int main(){
	cin>>n>>k;
	for(int i=1;i<=k;i++)cin>>a[i];
	if(k%2==0){
		int sum=0;
		for(int i=2;i<=k;i+=2)sum+=a[i]-a[i-1];
		cout<<sum<<endl;
		return 0;
	}
	else{
		int ans=2e8;
		for(int i=2;i<=k;i++) sl[i]=sl[i-2]+a[i]-a[i-1];
		for(int i=k-1;i>=1;i-=2) sr[i]=sr[i+2]+a[i+1]-a[i];
		for(int i=1;i<=k;i+=2){
			int cur=sl[i-1]+sr[i+1];
			ans=min(ans,cur);
		}
		cout<<ans<<endl;
	}
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值