E-双生双宿之错

题目链接: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;
}


posted @ 2025-01-22 11:27  Marinaco  阅读(37)  评论(0)    收藏  举报
//雪花飘落效果