練習賽10.5.士兵站隊

士兵站隊

Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 8 Accepted Submission(s) : 6

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

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

5
1 2
2 2
1 3
3 -2
3 3

Sample Output

8
思路分析:本題其實爲數學裏面的求平均數;要注意一點小技巧,就是x 可能有相同的座標要處理下。
代碼:#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
int main()
{
    int n,x[10020],y[10020],xx,yy,i,sum;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=1;i<=n;i++)
            scanf("%d%d",&x[i],&y[i]);
            sort(x+1,x+n+1);
             sort(y+1,y+n+1);
            for(i=1;i<=n;i++)
                x[i]=x[i]-i;//將X的座標延着從1開始。
            sort(x+1,x+n+1);
            //if(n%2==0)
            xx=(x[(1+n)/2]);
            yy=(y[(1+n)/2]);
            sum=0;
            for(i=1;i<=n;i++)
            {
                sum+=abs(x[i]-xx);
                sum+=abs(y[i]-yy);
            }
            printf("%d\n",sum);
    }
    return 0;
}
發佈了41 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章