题目大意:
现在给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;
}