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 @   Marinaco  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示