日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

P2278-[HNOI2003]操作系统【堆】

發布時間:2023/12/3 windows 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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]操作系统【堆】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。