githup网站建设,免费企业官网怎么做,东莞企业网站制作,一键生成广告正题
题目链接#xff1a; https://www.luogu.org/problemnew/show/P2278 题意
有若干个进程#xff0c;每个进程有优先级#xff0c;运行时间#xff0c;放入时间。 如果一个进程到达的时候CPU是空闲的#xff0c;则它会一直占用CPU直到该进程结束。除非在这个过程中…正题
题目链接 https://www.luogu.org/problemnew/show/P2278 题意
有若干个进程每个进程有优先级运行时间放入时间。 如果一个进程到达的时候CPU是空闲的则它会一直占用CPU直到该进程结束。除非在这个过程中有一个比它优先级高的进程要运行。在这种情况下这个新的优先级更高的进程会占用CPU而老的只有等待。
如果一个进程到达时CPU正在处理一个比它优先级高或优先级相同的进程则这个新到达的进程必须等待。
一旦CPU空闲如果此时有进程在等待则选择优先级最高的先运行。如果有多个优先级最高的进程则选择到达时间最早的。 解题思路
维护一个堆然后在放入程序时做处理 如果可以运行完当前程序就运行之后就打断当前运行程序。 所有程序插入完之后按顺序模拟就好了。 代码
#includecstdio
#includealgorithm
using namespace std;
struct exe{int number,ans,longs,rtime;
}a[15001],k[15001];
int num,n,now,tot,nn,rt,ls,an;
void up1(int x)
{while (x1 (a[x/2].ansa[x].ans || a[x/2].ansa[x].ans a[x/2].rtimea[x].rtime)){swap(a[x/2],a[x]);x/2;}
}//维护
void down1(int x)
{int y;while (x*2num (a[x*2].ansa[x].ans || a[x*2].ansa[x].ans a[x*2].rtimea[x].rtime) || x*21num (a[x*21].ansa[x].ans || a[x*21].ansa[x].ans a[x*21].rtimea[x].rtime)){yx*2;if (y1num (a[y].ansa[y1].ans || a[y].ansa[y1].ans a[y].rtimea[y1].rtime)) y;swap(a[y],a[x]);xy;}
}//维护
int main()
{//freopen(data.in,r,stdin);//freopen(data.out,w,stdout);tot0;num0;while (scanf(%d%d%d%d,nn,rt,ls,an)4){while (numa[1].longsrt-now)//运行完可以运行完的程序{printf(%d %d\n,a[1].number,nowa[1].longs);nowa[1].longs;swap(a[1],a[num]);num--;down1(1);}if (num0 rt-now0)//打断a[1].longs-rt-now;a[num].ansan;a[num].numbernn;//放入CPUa[num].rtimert;a[num].longsls;up1(num);nowrt;}while (num)//模拟剩下的{printf(%d %d\n,a[1].number,nowa[1].longs);nowa[1].longs;swap(a[1],a[num]);num--;down1(1);}
}