Xin chào mọi người, em đang làm bài parallel processing simulator. Đây là đề bài:
Em ví dụ:
Input:
2 5
1 2 3 4 5
Output:
0 0
1 0
0 1
1 2
0 4
Còn đây là cách em hiểu bài toán:
Jobs sẽ lần lượt vào Counter 0,1; sau đó nó sẽ lưu vào timeline của mỗi cái counter. Code của em có dùng priority queue để lưu counter lại. (vì em lười tạo min priority queue nên dùng max priority queue). Jobs[i] lưu lại thời gian thực thi của i. Assigned_workers_[i] để lưu lại counter mà i đã đến. Start_times_[i] là thời điểm bắt đầu công việc của i. Next_free_time để lưu lại timeline làm việc của 2 counter. Code của em vẫn còn sai gì đó mà em không nghĩ ra, mọi người xem và gợi ý giúp em với. Em xin cảm ơn ạ :3
// Assignment2Problem2.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
#include "pch.h"
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
class JobQueue {
private:
int num_workers_;
vector<int> jobs_;
vector<int> assigned_workers_;
vector<long long> start_times_;
void WriteResponse() const {
for (int i = 0; i < jobs_.size(); ++i) {
cout << assigned_workers_[i] << " " << start_times_[i] << "\n";
}
}
void ReadData() {
int m;
cin >> num_workers_ >> m;
jobs_.resize(m);
for (int i = 0; i < m; ++i)
cin >> jobs_[i];
}
void AssignJobs() {
// TODO: replace this code with a faster algorithm.
/*
assigned_workers_.resize(jobs_.size());
start_times_.resize(jobs_.size());
vector<long long> next_free_time(num_workers_, 0);
for (int i = 0; i < jobs_.size(); ++i) {
int duration = jobs_[i];
int next_worker = 0;
for (int j = 0; j < num_workers_; ++j) {
if (next_free_time[j] < next_free_time[next_worker])
next_worker = j;
}
assigned_workers_[i] = next_worker;
start_times_[i] = next_free_time[next_worker];
next_free_time[next_worker] += duration;
}
*/
priority_queue<int> counter;
vector <long long> next_free_time(num_workers_);
assigned_workers_.resize(jobs_.size());
start_times_.resize(jobs_.size());
int temp_customer = 0;
while (temp_customer < jobs_.size())
{
for (int i = 0; i < num_workers_; i++)
{
counter.push(i);
}
while (counter.empty() == 0)
{
int free_counter = num_workers_ - counter.top() - 1;
counter.pop();
assigned_workers_[temp_customer] = free_counter;
start_times_[temp_customer] = next_free_time[free_counter];
next_free_time[free_counter] += jobs_[temp_customer];
temp_customer++;
if (temp_customer >= jobs_.size()) return;
}
}
}
public:
void Solve() {
ReadData();
AssignJobs();
WriteResponse();
}
};
int main() {
ios_base::sync_with_stdio(false);
JobQueue job_queue;
job_queue.Solve();
return 0;
}