链接:https://www.nowcoder.com/questionTerminal/f76b7bc64e554edaa53d8e0d84f921c5?f=discussion
来源:牛客网

题目的表述非常绕.仔细阅读并尝试理解题意.

我们应该为每个PM保持1个priority_queue,保存当前已经被提出来的idea.注意,程序员只能看到他的首个idea(程序员眼中的优先排名准则与pm不同!)

开一个完成时间的数组time_of_idea_completed记录每个idea的完成时间.

开一个数组time_to_finish_current_idea,其中time_to_finish_current_idea[i]的含义为编号为i(从1开始编号)的程序员手头上的idea还要处理多久.

设置一个变量current_time来保存当前时间

设置一个变量num_of_ideas_left记录当前时间点还有多少idea没有被分配给程序员.进入主循环的条件是还有任务没有被分配(一旦任务都被分配,就可以确定它们在什么时间被完成,就不需要继续模拟了)

传入的参数ideas按照时间升序排列(按照降序排列然后从尾部移出效率更高,但是没那么直观.本题数据规模不大,这样也可以通过)

另外设置一个

vector<priority_queue<idea> >ideas_has_been_proposed_group_by_pm,按照下标保存每个pm当前时间点已经提出的idea并且按照pm的优先级排名排成一个优先队列.C++的优先队列默认是大顶堆,即top()返回最大元,与Java相反.</idea>

进入主循环之后时间+1.我们考虑什么东西需要更新:可能有一些idea被提出来(判断条件为提出idea的时间<=current_time)我们将这些idea从ideas移出并加入对应的pm的优先队列中

开一个vector保存所有的”pm眼中的最重要idea”.(可能有一些pm的所有idea都已经被分配了那么他的队列为空)

新建一个临时vector保存每个pm眼中优先级最高的idea.注意,这个vector需要按照程序员的标准进行排序.

循环考虑每个程序员的变化.他手头上的idea剩余处理时间-1.一旦这个时间为0,表明他可以接手下一个idea.如果temp不为空那么他确实需要接手一个idea(可能出现空闲但是无事可做的情况,比如所有的idea都是时间10以后提出的.)

然后每次程序员按照程序员的标准找优先级最高的idea,就是temp[0]并接手.一旦一个idea被程序猿选中,从这个临时vector中删去这项任务,然后从这个idea对应的pm的优先队列中出队这个idea,然后如果pm的队列不空表示他还有没实现的idea,将这个pm的下一个idea放入临时vector

链接:https://www.nowcoder.com/questionTerminal/f76b7bc64e554edaa53d8e0d84f921c5?f=discussion
来源:牛客网

#include<stdio.h>
#include<stdlib.h>
#include<vector>
#include<iostream>
#include<list> 
#include<stack>
#include<queue>
#include<algorithm>
using namespace std;
class idea {
public:
    int index;
    int pm_num;
    int proposed_time;
    int priority;
    int time_needed;

    idea(int index, int pm_num, int proposed_time, int priority, int time_needed)
    {
        this->index = index;
        this->pm_num = pm_num;
        this->proposed_time = proposed_time;
        this->priority = priority;
        this->time_needed = time_needed;
    }
    bool operator<(const idea& idea2) const {
        if (this->priority < idea2.priority)return true;
        else if (this->priority > idea2.priority)return false;

        if (this->time_needed > idea2.time_needed)return true;
        else if (this->time_needed < idea2.time_needed)return false;

        return(this->proposed_time > idea2.proposed_time);
    }
};

bool cmp_time(idea a, idea b)
{
    return a.proposed_time < b.proposed_time;
}

bool cmp_programmer(idea idea1, idea idea2)
{

    if (idea1.time_needed < idea2.time_needed)return true;
    else if (idea1.time_needed > idea2.time_needed)return false;


    return(idea1.pm_num < idea2.pm_num);
}

vector<int> proceed(int n, int m, int p, vector<idea>&ideas)
{
    int num_of_ideas_left = p;
    sort(ideas.begin(), ideas.end(), cmp_time);
    vector<int> ans;
    vector<priority_queue<idea> >ideas_has_been_proposed_group_by_pm(n+1);

    vector<vector<idea> >ideas_to_be_proposed_group_by_pm(n+1);


    int time_to_finish_current_idea[3010];
    int time_of_idea_completed[3010];
    for (int i = 0; i < 3010; i++) {
        time_to_finish_current_idea[i] = 0;
        time_of_idea_completed[i] = 0;
    }
    int current_time = 0;



    while (num_of_ideas_left) {
        current_time++;
        int index = 0;
        while (index < ideas.size() && ideas[index].proposed_time <= current_time)index++;

        for (int i = 0; i < index; i++)
            ideas_has_been_proposed_group_by_pm[ideas[i].pm_num].push(ideas[i]);
        ideas.erase(ideas.begin(), ideas.begin() + index);



        vector<idea>temp;
        for (int i = 1; i <= n; i++)
            if (!ideas_has_been_proposed_group_by_pm[i].empty())
                temp.push_back(ideas_has_been_proposed_group_by_pm[i].top());
        sort(temp.begin(), temp.end(), cmp_programmer);


        int i = 1;
        while (  i <= m) {
            if (time_to_finish_current_idea[i] > 0)
                time_to_finish_current_idea[i]--;
            if(time_to_finish_current_idea[i]==0&& !temp.empty())
             {
                idea idea0 = temp[0];
                time_to_finish_current_idea[i] = idea0.time_needed;
                temp.erase(temp.begin(), temp.begin() + 1);
                ideas_has_been_proposed_group_by_pm[idea0.pm_num].pop();
                if (!ideas_has_been_proposed_group_by_pm[idea0.pm_num].empty()) {
                    temp.push_back(ideas_has_been_proposed_group_by_pm[idea0.pm_num].top());
                    sort(temp.begin(), temp.end(), cmp_programmer);
                }
                time_of_idea_completed[idea0.index] = current_time + idea0.time_needed;
                num_of_ideas_left--;
            }
            i++;
        }
    }
    for (int i = 1; i <= p; i++)
        ans.push_back(time_of_idea_completed[i]);
    return ans;
}

int main() {
    /*
    int n = 2, m = 2, p = 5;
    idea idea1(1, 1, 1, 1, 2);
    idea idea2(2, 1, 2, 1, 1);
    idea idea3(3, 1, 3, 2, 2);
    idea idea4(4, 2, 1, 1, 2);
    idea idea5(5, 2, 3, 5, 5);
    vector<idea>ideas;
    ideas.push_back(idea1);
    ideas.push_back(idea2);
    ideas.push_back(idea3);
    ideas.push_back(idea4);
    ideas.push_back(idea5);
    vector<int>ans = proceed(n, m, p, ideas);

    for (int temp : ans)printf("%d\n", temp);
    getchar();
    */
    int n, m, p;
    int pm_num;
    int proposed_time;
    int priority;
    int time_needed;
    cin >> n >> m >> p;
    vector<idea>ideas;
    for (int i = 0; i < p; i++) {
        cin >> pm_num >> proposed_time >> priority >> time_needed;
        idea idea_temp(i + 1, pm_num, proposed_time, priority, time_needed);
        ideas.push_back(idea_temp);
    }
    vector<int>ans = proceed(n, m, p, ideas);

    for (int temp : ans)printf("%d\n", temp);
     return 0;
}