1018: 士兵排阵

使用中位数定理
先要排序,但对于X数组,我先排一次序,然后对X数组做减法,相当于对等式做了变形
还需要再排一次序,才能对X数组使用中位数定理

#include <bits/stdc++.h>
using namespace std;
int n;
const int N=10010;
int x[N];
int y[N];
int main(){
	int n;
	while(scanf("%d",&n)!=EOF){
		for(int i=1;i<=n;i++){
			scanf("%d%d",&x[i],&y[i]);
		}
		sort(y+1,y+n+1);
		sort(x+1,x+n+1);
		for(int i=1;i<=n;i++){
			x[i]-=(i-1);
		}
		sort(x+1,x+n+1);
		int y_target=0;
		int x_target=0;
		if(n%2==0)
			{y_target=y[n/2];
			x_target=x[n/2];}
		else{
			y_target=y[n/2+1];
			x_target=x[n/2+1];}
		long long sum=0;
		for(int i=1;i<=n;i++){
			sum+=abs(y[i]-y_target);
			sum+=abs(x[i]-x_target);			
		}
		printf("%lld\n",sum);
		
	}
	return 0;
} 
posted @ 2026-03-15 11:28  peter_shen  阅读(3)  评论(0)    收藏  举报