網易筆試題 堆棋子

2021-08-07 15:10:33 字數 1476 閱讀 3176

小易將n個棋子擺放在一張無限大的棋盤上。第i個棋子放在第x[i]行y[i]列。同乙個格仔允許放置多個棋子。每一次操作小易可以把乙個棋子拿起並將其移動到原格仔的上、下、左、右的任意乙個格仔中。小易想知道要讓棋盤上出現有乙個格仔中至少有i(1 ≤ i ≤ n)個棋子所需要的最少操作次數.

輸入描述:

輸入包括三行,第一行乙個整數n(1 ≤ n ≤ 50),表示棋子的個數

第二行為n個棋子的橫座標x[i](1 ≤ x[i] ≤ 10^9)

第三行為n個棋子的縱座標y[i](1 ≤ y[i] ≤ 10^9)

輸出描述:

輸出n個整數,第i個表示棋盤上有乙個格仔至少有i個棋子所需要的運算元,以空格分割。行末無空格

如樣例所示:

對於1個棋子: 不需要操作

對於2個棋子: 將前兩個棋子放在(1, 1)中

對於3個棋子: 將前三個棋子放在(2, 1)中

對於4個棋子: 將所有棋子都放在(3, 1)中

示例1

輸入4

1 2 4 9

1 1 1 1

輸出0 1 3 10

首先明確曼哈頓距離:

座標(x1, y1)的i點與座標(x2, y2)的j點的曼哈頓距離為:

d(i,j)=|x1-x2|+|y1-y2|.

接著我們應該知道若在一維平面上,存在a,b,c三個點,那麼平面上若存在乙個點到3個點的曼哈頓距離之和的最小的點應該落在a,b,c其中乙個點中。如下圖:

上面b應該為最小的點。

最後我們應該注意到對於二維平面,我們可以將二維平面上的點(x,y)分別投影到對應的x軸和y軸,那麼我們就可以依次求出x軸上最小曼哈頓距離的點和y軸上最小曼哈頓距離的點,兩個點的座標就是本題的解。

**如下:

#include 

#include

#include

using

namespace

std;

vector

minops(int size,vector

x,vector

y)int resi=0;

int sum=0;

//依次分別取出優先佇列的值,分別為每個棋子到(x[i],y[i])距離的最小值,次小值...最大值

while(!pq.empty())}}

return res;

}int main()

for(int i=0;icin>>tmp;

y[i]=tmp;

}vector

res(size);

res=minops(size,x,y);

for(int i=0;i1;i++)

cout

<1];

}

堆棋子 網易2018校招

題目描述 小易將n個棋子擺放在一張無限大的棋盤上。第i個棋子放在第x i 行y i 列。同乙個格仔允許放置多個棋子。每一次操作小易可以把乙個棋子拿起並將其移動到原格仔的上 下 左 右的任意乙個格仔中。小易想知道要讓棋盤上出現有乙個格仔中至少有i 1 i n 個棋子所需要的最少操作次數.輸入描述 輸入...

網易有道筆試題

這幾道題都是從網上找的不知道是哪一年的網易有道的筆試題,拿來做做,練練手。1 列印如下形式的矩陣 n 5 1 2 9 10 25 4 3 8 11 24 5 6 7 12 23 16 15 14 13 22 17 18 19 20 21 n 6 1 2 9 10 25 26 4 3 8 11 24 ...

網易 筆試題(20190921)

要使得數字和達到要求並且最小,那就是剛好等於x值,即n值從後往前填充,逢9向前移一進製。def min bit sum x if x 10 return x res 0 base 1while x if x 9 res 9 base x 9else res x base x 0 base 10ret...