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;
}

浙公网安备 33010602011771号