题目链接:https://ac.nowcoder.com/acm/contest/95323/E
题意:
给定一个长度为偶数的数组,要求将其转化为只有两个元素且两个元素数量相等的数组。每次操作可以将数组元素+1或者-1,求最小的操作次数
思路:
先将数组排序,前一半肯定对应要转化的较小的那一个元素,不妨设为x。后一半转化为较大的那一个元素,设为y
发现前一半和后一半的数组要转化为各自中位数时,代价是最小的(跟货舱选址那一题证明一样)
如果x和y相等还要将x-1,y和x,y+1做比较,取最小的
数组元素<=1e9,所以记得开long long
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t;
const int maxn=1e5+5;
int arr[maxn];
signed main()
{
ios::sync_with_stdio(false),cin.tie(0);
cin>>t;
while(t--)
{
int n;cin>>n;
for(int i=1;i<=n;i++){
cin>>arr[i];
}
sort(arr+1,arr+1+n);
int x=arr[(1+n/2)/2];
int y=arr[(n/2+1+n)/2];
int res=0;
if(x==y)
{
int ans1=0,ans2=0;
x=x-1;
for(int i=1;i<=n;i++){
if(i<=n/2){
ans1+=abs(arr[i]-x);
}else{
ans1+=abs(arr[i]-y);
}
}
x=x+1;
y=y+1;
for(int i=1;i<=n;i++){
if(i<=n/2){
ans2+=abs(arr[i]-x);
}else{
ans2+=abs(arr[i]-y);
}
}
res=min(ans1,ans2);
}else{
for(int i=1;i<=n;i++){
if(i<=n/2){
res+=abs(arr[i]-x);
}else{
res+=abs(arr[i]-y);
}
}
}
cout<<res<<endl;
}
return 0;
}
标签:arr,int,元素,cin,转化,数组,双生,双宿,之错
From: https://www.cnblogs.com/benscode/p/18685377