5

士兵

思路

考虑求的是曼哈顿距离,所以 \(x,y\) 是分离的。对于 \(y\),就是经典的求中位数,不再赘述。对于 \(x\),架设这 \(n\)\(x\)\(x_1,x_2,\dots,x_n\),最后需要定成 \(a+1,a+2,\dots,a+n\),首先可以发现一个性质,前后相邻 \(x\) 的相对大小不变。比如下图:

例如有两个点 \(x,y\)(含义与上文不同),移动后为 \(x',y'\),那么一定可以交换二者,使答案更优。然后求一下距离是 \(\sum_{i=1}^n x_i-(a+i)\),整理得 \(\sum_{i=1}^n (x_i-i)-a\),把点 \(x_i\) 当作 \(x_i-i\),那么就可以同 \(y\) 坐标一样处理了。

#include<bits/stdc++.h>
using namespace std;
const int N=10010;
int n,x[N],y[N];
int work(int *q){
	nth_element(q+1,q+(n+1>>1),q+1+n);
	int res=0;
	for(int i=1;i<=n;++i)res+=abs(q[i]-q[n+1>>1]);
	return res;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i)scanf("%d%d",x+i,y+i);
	sort(x+1,x+1+n);
	for(int i=1;i<=n;++i)x[i]-=i;
	printf("%d",work(x)+work(y));
    return 0;
}
posted @ 2023-02-24 22:00  wscqwq  阅读(9)  评论(0编辑  收藏  举报