P2278-[HNOI2003]操作系统【堆】
生活随笔
收集整理的這篇文章主要介紹了
P2278-[HNOI2003]操作系统【堆】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目鏈接:
https://www.luogu.org/problemnew/show/P2278
題意
有若干個進程,每個進程有優先級,運行時間,放入時間。
如果一個進程到達的時候CPU是空閑的,則它會一直占用CPU直到該進程結束。除非在這個過程中,有一個比它優先級高的進程要運行。在這種情況下,這個新的(優先級更高的)進程會占用CPU,而老的只有等待。
如果一個進程到達時,CPU正在處理一個比它優先級高或優先級相同的進程,則這個(新到達的)進程必須等待。
一旦CPU空閑,如果此時有進程在等待,則選擇優先級最高的先運行。如果有多個優先級最高的進程,則選擇到達時間最早的。
解題思路
維護一個堆,然后在放入程序時做處理:
如果可以運行完當前程序就運行,之后就打斷當前運行程序。
所有程序插入完之后,按順序模擬就好了。
代碼
#include<cstdio> #include<algorithm> 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 (x>1 && (a[x/2].ans<a[x].ans || a[x/2].ans==a[x].ans && a[x/2].rtime>a[x].rtime)){swap(a[x/2],a[x]);x/=2;} }//維護 void down1(int x) {int y;while (x*2<=num && (a[x*2].ans>a[x].ans || a[x*2].ans==a[x].ans && a[x*2].rtime<a[x].rtime) || x*2+1<=num && (a[x*2+1].ans>a[x].ans || a[x*2+1].ans==a[x].ans && a[x*2+1].rtime<a[x].rtime)){y=x*2;if (y+1<=num && (a[y].ans<a[y+1].ans || a[y].ans==a[y+1].ans && a[y].rtime>a[y+1].rtime)) y++;swap(a[y],a[x]);x=y;} }//維護 int main() {//freopen("data.in","r",stdin);//freopen("data.out","w",stdout);tot=0;num=0;while (scanf("%d%d%d%d",&nn,&rt,&ls,&an)==4){while (num&&a[1].longs<=rt-now)//運行完可以運行完的程序{printf("%d %d\n",a[1].number,now+a[1].longs);now+=a[1].longs;swap(a[1],a[num]);num--;down1(1);}if (num>0 && rt-now>0)//打斷a[1].longs-=rt-now;a[++num].ans=an;a[num].number=nn;//放入CPUa[num].rtime=rt;a[num].longs=ls;up1(num);now=rt;}while (num)//模擬剩下的{printf("%d %d\n",a[1].number,now+a[1].longs);now+=a[1].longs;swap(a[1],a[num]);num--;down1(1);} }總結
以上是生活随笔為你收集整理的P2278-[HNOI2003]操作系统【堆】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 天佑我的爱人歌词 每一个明天歌词
- 下一篇: POJ2352-Stars【树状数组】