将任务以创建时间、PM的ID排序输入到队列A中,后期对队列A中的任务进行分配。时间k从0开始递增,当前时间k与Idea提出的时间相等时将其从队列A踢出,并加入到任务队列B中。每个任务的完成时刻等于当前时间加上完成任务所需的时间。若程序员没有做工,则从任务队列B中获取任务,工作时间等于任务所需时间,时间k每次增加1,程序员所需工作时间减少1,减完则获取任务。参考了一个Java版本的题解。
#include <stdio.h>
#include <iostream>
#include <queue>
#include <map>
#include <string.h>
using namespace std;
class task
{
public:
int m_id;
int m_create_time;
int m_proirity;
int m_need_time;
task(int id, int create_time, int proirity, int need_time)
{
m_id = id;
m_create_time = create_time;
m_proirity = proirity;
m_need_time = need_time;
}
bool operator == (const task& other) const
{
return m_id == other.m_id
&& m_create_time==other.m_create_time
&& m_proirity == other.m_proirity
&& m_need_time == other.m_need_time;
}
bool operator < (const task& other) const
{
if(m_proirity == other.m_proirity)
{
if(m_need_time == other.m_need_time)
{
if(m_create_time == other.m_create_time)
{
return m_id > other.m_id;
}else
{
return m_create_time > other.m_create_time;
}
}
else
{
return m_need_time > other.m_need_time;
}
}
else
{
return m_proirity > other.m_proirity;
}
}
void print()
{
cout << m_id << " " << m_create_time << " " << m_proirity << " " << m_need_time << endl;
}
};
struct cmper
{
bool operator() (const task& a, const task& b)
{
if((a.m_create_time) == (b.m_create_time))
{
return (a.m_id) > (b.m_id);
}
else
{
return (a.m_create_time) > (b.m_create_time);
}
}
};
int main()
{
priority_queue<task, vector<task>, cmper > m_queue_create;
priority_queue<task> m_queue_task;
vector<task> m_task_vec;
map<task,int> m_task_map;
int n,m,p;
cin >> n >> m >> p;
for(int i=0;i<p;i++)
{
int a,b,c,d;
cin >> a >> b >> c >> d;
task t = task(a,b,c,d);
m_queue_create.push(t);
m_task_map[t] = 0;
m_task_vec.push_back(t);
}
//时间k从0开始递增;
int k = 0;
int* programer = new int[m];
memset(programer,0,sizeof(int) * m);
while(!m_queue_create.empty() || !m_queue_task.empty())
{
while(!m_queue_create.empty())
{
task t = m_queue_create.top();
if(t.m_create_time == k)
{
//t.print();
m_queue_task.push(t);
m_queue_create.pop();
}
else
{
break;
}
}
//程序员从0到m;
for(int i=0;i<m;)
{
if(programer[i] > 0)
{
//程序员做工;
programer[i]--;
i++;
}else
{
//程序员接受任务;
if(m_queue_task.empty())
{
//无任务可接;
i++;
}else{
//有任务可接;
task t = m_queue_task.top();
programer[i] = t.m_need_time;
m_task_map[t] = k+t.m_need_time;
m_queue_task.pop();
}
}
}
k++;
}
for(auto& v:m_task_vec)
{
cout << m_task_map[v] << endl;
}
return 0;
}
京公网安备 11010502036488号