题目链接
题意:
有n个命令,给定每个命令的 序号,最早开始时间(到达时间),需要持续的时间,优先级
某一时刻,当有多个命令都可以被解决时,优先选择优先级大的,如果优先级一样,优先选择最早开始时间早的执行
输出 n个命令被完成的时间(按被完成的从早到晚排序)
思路:
每到一个命令的开始时间,就把这个命令扔到优先队列中,并判断这个时间到上一个命令到达这一段时间中执行命令的情况
优先队列先按照优先级从大到小排序,然后按照开始时间从早到晚排序
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn = 10000005;
struct hh
{
ll num, t1, t2, grade;
bool operator<(const hh &a) const
{
if (grade != a.grade)
return grade < a.grade;
return t1 > a.t1;
}
} k[maxn];
priority_queue<hh> que;
int main()
{
hh k1;
ll n, m;
ll i = 1, j, pret = 0, nowt = 0;
while (scanf("%lld%lld%lld%lld", &k[i].num, &k[i].t1, &k[i].t2, &k[i].grade) != EOF)
{
if (i == 1)
{
pret = k[1].t1;
que.push(k[1]);
}
if (i != 1)
{
nowt = k[i].t1;
while (nowt - pret > 0 && que.empty() == 0)
{
k1 = que.top();
que.pop();
if (nowt - pret >= k1.t2)
{
pret += k1.t2;
printf("%lld %lld\n", k1.num, pret);
}
else
{
k1.t2 = k1.t2 - nowt + pret;
que.push(k1);
pret = nowt;
}
}
if (que.empty() != 0)
pret = nowt;
que.push(k[i]);
}
i++;
}
if (i == 2)
printf("%lld %lld\n", k[1].num, k[1].t1 + k[1].t2);
else
{
while (que.empty() == 0)
{
k1 = que.top();
que.pop();
printf("%lld %lld\n", k1.num, nowt + k1.t2);
nowt += k1.t2;
}
}
}