#include #include #include #include class Solution { public: static std::vector busiestServers(int k, const std::vector& arrival, const std::vector& load) { int n = arrival.size(); std::set pool; // pair [nextFinish, id] std::priority_queue, std::vector>, std::greater<>> q; // Load time std::vector cnt(k); // Initially, all server are available. for (int i = 0; i < k; ++i) pool.insert(i); // Simulate over time... for (int i = 0; i < n; ++i) { int t = arrival[i]; // Pop any finished tasks, then put them into the pool. while (!q.empty() && q.top().first <= t) { pool.insert(q.top().second); q.pop(); } // If no available, ignore this task. if (pool.empty()) continue; // Find the server to use. auto it = pool.lower_bound(i % k); if (it == pool.end()) it = pool.begin(); // Record the usage ++cnt[*it]; q.push({t + load[i], *it}); pool.erase(it); } int m = *std::max_element(cnt.begin(), cnt.end()); std::vector ret; for (int i = 0; i < k; ++i) if (m == cnt[i]) ret.push_back(i); return ret; } }; int main() { std::vector ret = Solution::busiestServers(3, {1, 2, 3, 4, 5}, {5, 2, 3, 3, 3}); for (int i : ret) std::cout << i << ' '; return 0; }