产品经理(PM)有很多好的idea,而这些idea需要程序员实现。现在有N个PM,在某个时间会想出一个 idea,每个 idea 有提出时间、所需时间和优先等级。对于一个PM来说,最想实现的idea首先考虑优先等级高的,相同的情况下优先所需时间最小的,还相同的情况下选择最早想出的,没有 PM 会在同一时刻提出两个 idea。
同时有M个程序员,每个程序员空闲的时候就会查看每个PM尚未执行并且最想完成的一个idea,然后从中挑选出所需时间最小的一个idea独立实现,如果所需时间相同则选择PM序号最小的。直到完成了idea才会重复上述操作。如果有多个同时处于空闲状态的程序员,那么他们会依次进行查看idea的操作。
求每个idea实现的时间。
输入第一行三个数N、M、P,分别表示有N个PM,M个程序员,P个idea。随后有P行,每行有4个数字,分别是PM序号、提出时间、优先等级和所需时间。输出P行,分别表示每个idea实现的时间点。
输入描述:
输入第一行三个数N、M、P,分别表示有N个PM,M个程序员,P个idea。随后有P行,每行有4个数字,分别是PM序号、提出时间、优先等级和所需时间。全部数据范围 [1, 3000]。
输出描述:
输出P行,分别表示每个idea实现的时间点。
输入例子1:
2 2 5 1 1 1 2 1 2 1 1 1 3 2 2 2 1 1 2 2 3 5 5
输出例子1:
3 4 5 3 9
新增知识点 map存储依据key有序 oop
#include<iostream> #include<vector> #include<map> #include<algorithm> using namespace std; struct Task { int id, pmid, t, prio, dur; }; vector<vector<Task>> pmtask; map<int, int> result; int proid = 1; struct programer { programer() : t(1), id(proid++) {} int t, id; int do_task() { vector<Task> :: iterator findT; int index = -1;//start or not for(size_t i = 0; i < pmtask.size(); ++i) {//find each pm's most wanted task and select the least dur one if(pmtask[i].empty()) continue; auto &pmit = pmtask[i]; auto taskit = pmtask[i].begin(); while(taskit != pmit.end() && taskit -> t > t) taskit++; if(taskit == pmit.end()) continue; if(index != -1) {//not understood if(taskit -> dur < findT -> dur) { findT = taskit; index = i; } } else { findT = taskit; index = i; } } if(index != -1)//work for one task { t += findT -> dur; result[findT -> id] = t; pmtask[index].erase(findT); return 1; } else ++t; return 0; } }; int main() { int n, m, p, q; cin >> n >> m >> p; q = p; pmtask.resize(n); vector<programer> pros(m); for (size_t i = 0; i < p; ++i) { Task task; cin >> task.pmid >> task.t >> task.prio >> task.dur; task.id = i; pmtask[task.pmid - 1].push_back(task); } for (size_t i = 0; i < n; ++i) { auto &tasks = pmtask[i]; if(tasks.empty()) continue; sort(tasks.begin(), tasks.end(), [](Task &t1, Task &t2){ if(t1.prio == t2.prio) { if(t1.dur == t2.dur) return t1.t < t2.t; else return t1.dur < t2.dur; } else return t1.prio > t2.prio; }); } while (q > 0) { sort(pros.begin(), pros.end(), [](programer &t1, programer &t2){return t1.t < t2.t;}); q -= pros.begin() -> do_task(); } for (auto &it : result) cout << it.second << endl; }