5

士兵

思路

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

例如有两个点 x,y(含义与上文不同),移动后为 x,y,那么一定可以交换二者,使答案更优。然后求一下距离是 i=1nxi(a+i),整理得 i=1n(xii)a,把点 xi 当作 xii,那么就可以同 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;
}

本文作者:wscqwq

本文链接:https://www.cnblogs.com/wscqwq/p/17153344.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   wscqwq  阅读(11)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起