LeetCode每天刷day30: 2019 力扣杯 校园自行车分配

版权声明:本文为博主原创文章,未经博主允许可以转载。(转呀转呀/笑哭),希望标注出处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;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_36428171/article/details/89318263