小易將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...