社区讨论
求助啊,十个点都tle,数据都那么复杂吗?
P2278[HNOI2003] 操作系统参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mi7cmnf1
- 此快照首次捕获于
- 2025/11/20 19:29 4 个月前
- 此快照最后确认于
- 2025/11/20 19:29 4 个月前
CPP
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
struct node
{
int dd;
int zx;
int yx;
int bh;
bool operator <(const node &p)const
{
if(dd==p.dd and yx==p.yx)
return bh>p.bh;
if(dd==p.dd)
return yx<p.yx;
if(dd!=p.dd)
return dd>p.dd;
}
}task[9000000];
int main()
{
priority_queue<node>q;
int n=1;
while(scanf("%d%d%d%d",&task[n].bh,&task[n].dd,&task[n].zx,&task[n].yx)!=EOF)
{
q.push(task[n]);
n++;
}
int time=0;
while(!q.empty())
{
node k=q.top();
q.pop();
while(time>q.top().dd)//一个任务完成后,后面有先前等待的任务,
{//此时等待任务的到达时间应刷新到现在的时间
node t=q.top();
q.pop();
t.dd=time;
q.push(t);
}
while(k.dd==q.top().dd)//将任务平等到达时间后的操作(因为平等时间后
{// 堆顶元素是平等时间中优先级最高的或编号最小的,所以其他任务应是在其做完后再做
node h=q.top();
q.pop();
h.dd=k.dd+k.zx;
q.push(h);
time=k.dd;
}
if(k.dd+k.zx<=q.top().dd)//如果到达时间过了执行时间后下一个任务还没到达
{
printf("%d %d\n",k.bh,k.dd+k.zx);
time=k.dd+k.zx;
}
else//如果现在处理的任务还没执行完,下一个任务到达了 则将现在处理的任务完成
{///一部分后将现在处理的任务的到达时间更改为和下一个任务一样再放入堆中
//(比较优先级)
k.zx-=(q.top().dd-k.dd);
k.dd=q.top().dd;
time=k.dd;
q.push(k);
}
}
getchar();
getchar();
getchar();
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...