版权声明:本文为博主原创文章,未经博主允许可以转载。(转呀转呀/笑哭),希望标注出处hhh https://blog.csdn.net/qq_36428171/article/details/89318263
题目:
在由 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 开始)。
题目链接:校园自行车分配
C++:
class Solution {
public:
struct node{
int id_worker;
int id_bike;
int dis;
};
static bool cmp(const node &a, const node &b){
if(a.dis == b.dis){
if(a.id_worker == b.id_worker){
return a.id_bike < b.id_bike;
}
else
return a.id_worker < b.id_worker;
}
else
return a.dis < b.dis;
}
vector<int> assignBikes(vector<vector<int>>& workers, vector<vector<int>>& bikes) {
int n = workers.size();
int m = bikes.size();
bool visw[n];
bool visb[m];
vector<int> ret(n);
vector<node> tmp;
memset(visw, 0, sizeof(visw));
memset(visb, 0, sizeof(visb));
node via;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
via.id_worker = i;
via.id_bike = j;
via.dis = abs(workers[i][0] - bikes[j][0]) + abs(workers[i][1] - bikes[j][1]);
tmp.push_back(via);
}
}
sort(tmp.begin(), tmp.end(), cmp);
int cnt = 0;
for(int i = 0; i < tmp.size(); i++){
if(!visw[tmp[i].id_worker]&&!visb[tmp[i].id_bike]){
ret[tmp[i].id_worker] = tmp[i].id_bike;
visw[tmp[i].id_worker] = true;
visb[tmp[i].id_bike] = true;
cnt++;
}
if(cnt == n)
break;
}
return ret;
}
};