美文网首页
5002. 校园自行车分配

5002. 校园自行车分配

作者: 薄荷糖的味道_fb40 | 来源:发表于2019-04-15 16:50 被阅读0次

    在由 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;
    }
    
    

    相关文章

      网友评论

          本文标题:5002. 校园自行车分配

          本文链接:https://www.haomeiwen.com/subject/wqqpwqtx.html