题目的意思是,给定任务的ID和执行间隔,每次按照执行的时间顺序输出前k个任务的ID号,当时间相同时,按照字典序输出ID小的。解题思路建立一个最小堆,每次输出最小堆之后将根节点加上周期重新调整堆。
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
struct Node
{
int Now; // current value
int ID;
int Period;
}node[3005];
int K;
void downModify(Node h[], int start, int length)
{
Node temp = node[start];
int cur = start * 2;
while (cur <= length)
{
if (cur < length)
{
if (node[cur].Now > node[cur + 1].Now)
{
cur++;
}
else if ((node[cur].Now == node[cur + 1].Now) && (node[cur].ID > node[cur + 1].ID))
{
cur++;
}
}
if (temp.Now < node[cur].Now || (temp.Now == node[cur].Now && temp.ID < node[cur].ID))
break;
node[start] = node[cur];
start = cur;
cur = start * 2;
}
node[start] = temp;
}
void init(Node h[], int length)
{
for (int j = length / 2; j > 0; j--)
downModify(node, j, length);
}
int main()
{
string str;
cin >> str;
int i = 1;
while (str.compare("#") != 0)
{
cin >> node[i].ID >> node[i].Period;
node[i].Now = node[i].Period;
i++;
cin >> str;
}
cin >> K;
int length = i - 1;
init(node, length);
for (int j = 0; j < K; j++)
{
cout << node[1].ID << endl;
node[1].Now += node[1].Period;
downModify(node, 1, length);
}
}