产品经理(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;
}

 

posted on 2018-04-05 13:00  bloomingFlower  阅读(450)  评论(1编辑  收藏  举报