Advertisement
nikunjsoni

1057

Jun 8th, 2021
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.33 KB | None | 0 0
  1. class Solution {
  2. public:
  3.     struct bikeWorkerPair{
  4.         int dist, workerId, bikeId;
  5.         bikeWorkerPair(int d, int wid, int bid):dist(d), workerId(wid), bikeId(bid){}
  6.        
  7.         bool operator<(const bikeWorkerPair &other)const{
  8.             if(other.dist != dist) return dist>other.dist;
  9.             if(workerId != other.workerId) return workerId > other.workerId;
  10.             return bikeId > other.bikeId;
  11.         }
  12.     };
  13.     vector<int> assignBikes(vector<vector<int>>& workers, vector<vector<int>>& bikes) {
  14.         priority_queue<bikeWorkerPair> q;
  15.         for(int i=0; i<workers.size(); i++)
  16.             for(int j=0; j<bikes.size(); j++){
  17.                 int dist = abs(workers[i][0] - bikes[j][0]) + abs(workers[i][1] - bikes[j][1]);
  18.                 q.push(bikeWorkerPair(dist, i, j));
  19.             }
  20.         vector<bool> visBike(bikes.size()+1, false);
  21.         vector<int> ans(workers.size(), -1);
  22.        
  23.         while(!q.empty()){
  24.             auto p = q.top(); q.pop();
  25.             if(!visBike[p.bikeId] && ans[p.workerId] == -1){
  26.                 ans[p.workerId] = p.bikeId;
  27.                 visBike[p.bikeId] = true;
  28.             }
  29.         }
  30.         return ans;
  31.     }
  32. };
  33.  
  34. --------------------------
  35.  
  36. class Solution {
  37. public:
  38.     // bucket sort
  39.     // O(N*M) time, O(N*M) space
  40.     vector<int> assignBikes(vector<vector<int>>& workers, vector<vector<int>>& bikes) {
  41.         // bucket sort since range of distance is [0, 2000]
  42.         vector<vector<pair<int, int>>> buckets(2001); // buckets[i] is the vector<worker id, bike id> with distance i
  43.         int n = workers.size(), m = bikes.size();
  44.         for (int i = 0; i < n; i++) {
  45.             for (int j = 0; j < m; j++) {
  46.                 int dis = abs(workers[i][0] - bikes[j][0]) + abs(workers[i][1] - bikes[j][1]);
  47.                 buckets[dis].push_back({i, j});
  48.             }
  49.         }
  50.         vector<int> res(n, -1);
  51.         vector<bool> bikeUsed(m, false);
  52.         for (int d = 0; d <= 2000; d++) {
  53.             for (int k = 0; k < buckets[d].size(); k++) {
  54.                 if (res[buckets[d][k].first] == -1 && !bikeUsed[buckets[d][k].second]) {
  55.                     bikeUsed[buckets[d][k].second] = true;
  56.                     res[buckets[d][k].first] = buckets[d][k].second;
  57.                 }
  58.             }
  59.         }
  60.         return res;
  61.     }
  62. };
  63.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement