在由 2D 网格表示的校园里有n位工人(worker)和 m辆自行车(bike),n <= m。所有工人和自行车的位置都用网格上的 2D 坐标表示。
我们需要为每位工人分配一辆自行车。在所有可用的自行车和工人中,我们选取彼此之间曼哈顿距离最短的工人自行车对 (worker, bike) ,并将其中的自行车分配給工人。如果有多个 (worker, bike) 对之间的曼哈顿距离相同,那么我们选择工人索引最小的那对。类似地,如果有多种不同的分配方法,则选择自行车索引最小的一对。不断重复这一过程,直到所有工人都分配到自行车为止。
给定两点p1和p2之间的曼哈顿距离为Manhattan(p1, p2) = |p1.x - p2.x| + |p1.y - p2.y|。
返回长度为 n 的向量 ans,其中 a[i]是第 i位工人分配到的自行车的索引(从 0 开始)。
示例 1:
image输入:workers = [[0,0],[2,1]], bikes = [[1,2],[3,3]]输出:[1,0]解释:工人 1 分配到自行车 0,因为他们最接近且不存在冲突,工人 0 分配到自行车 1 。所以输出是 [1,0]。
示例 2:
image输入:workers = [[0,0],[1,1],[2,0]], bikes = [[1,0],[2,2],[2,1]]输出:[0,2,1]解释:工人 0 首先分配到自行车 0 。工人 1 和工人 2 与自行车 2 距离相同,因此工人 1 分配到自行车 2,工人 2 将分配到自行车 1 。因此输出为 [0,2,1]。
提示:
0 <= workers[i][j], bikes[i][j] < 1000
所有工人和自行车的位置都不相同。
1 <= workers.length <= bikes.length <= 1000
思路:
一开始本来想建一个二维数组,行代表worker编号,列代表bike编号,存放内容是一个pair<int,int>,first存放曼哈顿距离,second放bike编号,然后对每一行排序,每行每次取最小值比较,后面发现最后一个例子超时了,怎么都优化不来。。。然后就决定换个解法了,用一个结构体存放(曼哈顿距离,工人编号,自行车编号),然后根据题意排序,最后取之前没有取过的数据组成结果就好了,代码实现如下(还是简书排版舒服点。。。博客园真的太难受了ToT)。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct node
{
int dis;
int worker;
int bike;
};
static bool cmp(const node& a, const node& b)
{
return a.dis == b.dis ? (a.worker == b.worker ? a.bike < b.bike : a.worker < b.worker) : a.dis < b.dis;
}
vector<int> assignBikes(vector<vector<int>>& workers, vector<vector<int>>& bikes) {
vector<int> bikeVisited(bikes.size(), 0);
vector<int> workersVisited(workers.size(), 0);
vector<int> res(workers.size(), 0);
vector<node> data;
int rows = workers.size();
int cols = bikes.size();
for (int row = 0; row<rows; row++)
{
for (int col = 0; col<cols; col++)
{
node temp;
temp.dis = abs(workers[row][0] - bikes[col][0]) + abs(workers[row][1] - bikes[col][1]);
temp.worker = row;
temp.bike = col;
data.push_back(temp);
}
}
sort(data.begin(), data.end(), cmp);
for (int i = 0; i < data.size(); i++)
{
if (!bikeVisited[data[i].bike] && !workersVisited[data[i].worker])
{
res[data[i].worker] = data[i].bike;
bikeVisited[data[i].bike] = 1;
workersVisited[data[i].worker] = 1;
}
}
return res;
}
//[[0, 0], [1, 0], [2, 0], [3, 0], [4, 0], [5, 0], [6, 0], [7, 0]]
//[[0, 999], [1, 999], [2, 999], [3, 999], [4, 999], [5, 999], [6, 999], [7, 999], [8, 999]]
int main()
{
vector<vector<int>> workers = { { 0, 0 }, { 1, 0 }, { 2, 0 }, { 3, 0 }, { 4, 0 }, { 5, 0 }, { 6, 0 }, { 7, 0 } };
vector<vector<int>> bikes = { { 0, 999 }, { 1, 999 }, { 2, 999 }, { 3, 999 }, { 4, 999 }, { 5, 999 }, { 6, 999 }, { 7, 999 }, { 8, 999 } };
vector<int> res = assignBikes(workers, bikes);
for (auto it:res)
{
cout << it << " ";
}
cout << endl;
system("pause");
return 0;
}
网友评论