美文网首页
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. 校园自行车分配

    在由 2D 网格表示的校园里有n位工人(worker)和 m辆自行车(bike),n <= m。所有工人和自行车的...

  • 学记四20151202

    学记四:北京大片新“彩蛋” 彩蛋一:ofo校园共享自行车 近几天,发现人大校园多了一大批黄色的自行车...

  • 慢一点,再慢一点

    最近喜欢上了骑自行车,有事没事就喜欢骑着自行车在校园里溜达。而且是骑得特别快的那种。今天,久违地没有骑车,在校园里...

  • 有趣的新材料、新技术、新模式

    有趣的新材料、新技术、新模式 校园自行车拥堵/自行车位不足 “共享单车”模式:车辆共享、互联网开锁&结算、(未来)...

  • 时光如梭之校园自行车

    “你怎么每天怎么这么晚才到实验室啊?”上午都快九点了,跟程老师做毕业设计的何清辉才姗姗来迟。已经不是第一次,程海忍...

  • 她和他

    一个姑娘和另一个姑娘在一个陌生的校园里面漫步,一个男孩骑着一辆二手自行车自行车从校园里面经过,他认识她,她又认识她...

  • 校园里,那背影

    支教回来,总在校园里看到一个背影,从最初的骑自行车到后来骑电动自行车,裙装,裤装,从棉袄到短袖,戴口罩,戴...

  • 2018-07-11

    碰见一个骑着自行车,在校园里迷路的老大爷,漫游,好玩儿,哈哈。

  • 随笔心情

    课堂上,同学站在讲台上揭老师的老底儿。 经常在校园看到球球老师骑着二八大杠的自行车。 同学:老师,你的自行车这么旧...

  • 北朝之恋(26)和朝鲜小朋友踢足球

    第26集 小雪很聪明,不到半个月就学会了骑自行车。她喜欢骑着自行车,慢悠悠地在校园晃荡。每次看到小雪穿白色衬衫,深...

网友评论

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

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