9209 士兵站隊問題

2021-09-29 01:29:47 字數 1880 閱讀 7396

time limit: 10 second

memory limit: 2 mb

問題描述

在乙個劃分成網格的操場上,n個士兵散亂地站在網格點上。網格點由整數座標(x,y)表示。 士兵們可以沿網格邊上、下、左、右移動一步,但在同一時刻任一網格點上只能有一名士兵。 按照軍官的命令,士兵們要整齊地列成乙個水平佇列,即排列成(x,y),(x+1,y),…,(x+n-1,y)。 如何選擇x和y的值才能使士兵們以最少的總移動步數排成一列。 

程式設計任務: 

計算使所有士兵排成一行需要的最少移動步數。

由檔案 input.txt 提供輸入資料。檔案的第1行是士兵數n,1≤n≤10000。 接下來n行是士兵的初始位置,每行2個整數x和y,-10000≤x,y≤10000。

將計算結構輸出到檔案output.txt.檔案的第一行中的數是士兵排成一行需要的最 少步數。

3

-4 -3

-4 5

5 2

16
【題解】

首先。要讓這些士兵都站到同一行。

先對y座標進行排序。

然後對於它們最後要站的行號k;

s=|a[1].y-k|+|a[2].y-k|+...+|a[n].y-k|;

要讓s最小。

想想都能知道k是a[1..n].y的中位數。

答案累加上|a[i]-k|;

這樣這些士兵就全都在一行上了。這個問題被轉化為乙個一維的問題了

然後是在列上的位置。

我們同樣對a[i].x進行公升序排序。

然後我們可以確定a[1].x,a[2].x,a[3].x。。。。a[n].x

這些位置上的士兵對應最後答案的k,k+1,k+2...k+n-1這些位置。

因為憑感覺就能知道這樣比較優。(難道a[n].x還要對應k嗎??);

然後s=|a[1].x-k|+|a[2].x-(k+1)|+|a[3].x-(k+2)|...+|a[n].x-(k+n-1)|;

同樣要讓s最小。

我們把s的表示式做一些改變。

s=|a[1].x-k|+|(a[2].x-1)-k|+|(a[3].x-2)-k|+...+|(a[n].x-(n-1))-k|

然後我們令b[i] = a[i].x-i+1;

s=|b[1]-k|+|b[2]-k|+...+|b[n]-k|;

沒錯。這又變成求y軸的方法了。

獲得b陣列之後再對b陣列進行一次公升序的排序。

然後獲得中位數k,再累加|b[i]-k|即可。

這裡可以不用再定義乙個b陣列,直接在a陣列的基礎上處理一下就好即-i+1;

只有一維的x座標的情況。你可以理解為。就是把k+1,k+2..k+n-1這些位置全部都移到

了k這個位置。然後本來要在k+1的人,先減去1然後再移到k時就相當於移到k+1了。

本來要在k+2的人同理。

【**】

#include #include using namespace std;

struct point //用於儲存輸入的點

;int n, ans = 0;

point a[10001 + 100]; //開大點沒關係的。

void input_data()

int cmp1(const point &a, const point &b) //比較函式1,這是y軸的

int cmp2(const point &a, const point &b) //這是x軸上的。

int abs(int x) //獲取乙個數的絕對值。

void get_ans1()

}void get_ans2() //這是x軸上的一維情況

void output_ans()

int main()

9209 士兵站隊問題

time limit 10 second memory limit 2 mb 問題描述 在乙個劃分成網格的操場上,n個士兵散亂地站在網格點上。網格點由整數座標 x,y 表示。士兵們可以沿網格邊上 下 左 右移動一步,但在同一時刻任一網格點上只能有一名士兵。按照軍官的命令,士兵們要整齊地列成乙個水平佇...

士兵站隊問題

問題描述 在乙個劃分成網格的操場上,n個士兵散亂地站在網格點上,網格點由整數座標 x,y 表示。士兵們可以沿網格邊上 下 左 右移動一步,但在同一時刻任一網點上只能有一名士兵。按照軍官的命令,士兵們要整齊地列成乙個水平佇列,即排列成 x,y x 1,y x n,y 如何選擇x和y的值才能使士兵們以最...

士兵站隊問題

題解 首先已知縱向移動可以直接通過求中位數得到 那麼問題就是橫方向移動了 我們假設第一位士兵站的位置是k,因為x從x1開始,那麼我們假設成起始位置為k 1吧 不懂接著看完你就懂了 那麼 第二位士兵的位置是 k 2,接著是k 3,k 4,k n 所以,士兵橫向 即平行於y軸方向 移動的距離為 x1 k...