题目:https://www.luogu.org/problemnew/show/P2278
思路全在代码里
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
struct node
{
int jin,dao,zhi,you;
bool operator <(const node &vv)const
{
if(vv.you==you)
return dao>vv.dao;
else
return you<vv.you;
}
};
priority_queue<node>q;
int ji,da,zh,yo;
long long sum;
int main()
{
while(scanf("%d %d %d %d",&ji,&da,&zh,&yo)!=EOF)//因为插进来已经按开始时间排好序了,所以边输入边处理即可
{
while(!q.empty()&&q.top().zhi+sum<=da)//这个就是处理进程的一部分,当下一个程序还没到而且还有进程可以完整的执行完,然后就叠加时间并且输出
{
node c=q.top();
q.pop();
sum+=c.zhi;
printf("%d %lld\n",c.jin,sum);
}
if(!q.empty())//这个就是当可以完整进行完的进程都解决了,那么剩下的肯定是进行到一部分还没有完全搞定的,那我们就强迫把某个进程分割成两部分,并且更新剩下的运行时间并且重新放进优先队列
{//当然,剩下的交给优先级就可以了,优先级高的肯定会进行,其他的不用管了
node c=q.top();
q.pop();
c.zhi=c.zhi-(da-sum);
q.push(c);
}
q.push((node){ji,da,zh,yo});
sum=da;
}
while(!q.empty())//最后处理完还没处理完的程序,输出
{
node c=q.top();
q.pop();
sum+=c.zhi;
printf("%d %lld\n",c.jin,sum);
}
}