士兵站队

来源:互联网 发布:幼儿园美工室设计 编辑:程序博客网 时间:2024/04/28 14:54

Problem Description

在一个划分成网格的操场上,n个士兵散乱地站在网格点上。网格点由整数坐标(x,y)表示。士兵们可以沿网格边上、下、左、右移动一步,但在同一时刻任一网格点上只能有一名士兵。按照军官的命令,士兵们要整齐地列成一个水平队列,即排成(x,y),(x+1,y),...,(x+n-1,y)。如何选择x和y的值才能使士兵们以最少的总移动步数排成一列。

Input

输入有多组数据,每组数组的第一行是士兵数n,1<=n<=10000。接下来n行是士兵的初始位置,每行2个整数x和y,-10000<=x,y<=10000。

Output

对于每组数据输出士兵排成一行需要的最小移动步数。

Sample Input

51 22 21 33 -23 3

Sample Output

8
/*
      解题报告:Y轴的坐标就是中位数。在X轴上,设它们的最终坐标为D,D+1,D+2....D+(N-1);
                则X轴上的每个点移动了SUM=|(X0-D)|+|(X1-D-1)|+|(X2-D-)|+.....+|(X(N-1)-D-N+1)|;
                变形可得:SUM=|(X0-D)|+|(X1-1-D)|+.....+|(X(N-1)-N+1-D)|.
                采取中位数求得D。
*/
//标程:
#include<stdio.h>#include<algorithm>#include<stdlib.h>using namespace std;int a[10010],b[10010];int main(){//freopen("a.txt","r",stdin);int n,i;while(scanf("%d",&n)!=EOF){for(i=0;i<n;i++) scanf("%d%d",&a[i],&b[i]);sort(a,a+n); sort(b,b+n);for(i=0;i<n;i++) a[i]-=i;sort(a,a+n);int sum1=0,sum2=0;        for(i=0;i<n;i++){sum1+=abs(a[i]-a[n/2]);sum2+=abs(b[i]-b[n/2]);}printf("%d\n",sum1+sum2);}return 0;}
原创粉丝点击