泡麵(優先佇列)

2021-10-01 09:08:09 字數 1792 閱讀 5522

牛牛在一輛有n個座位的火車上,假設座位排成一行。牛牛將這些座位從左至右編號為1到n。每個座位上都是一位商務人士,所以他們很忙,以至於在火車上只能吃泡麵。

火車開水房在第乙個座位的左側。第i個人選擇在ti​時刻開始,觀察從1到n的座位有無空位,如果有,他會認為這個人去接水吃泡麵了,於是他會等一會,如果沒有,他會去接水吃泡麵。

接一桶泡麵用水需要p的時間間隔,忽略從座位到接水口之間的時間,且接完水之後成功人士會立刻回到座位。

如果同時有多個人要去接水吃泡麵,離接水口最近的人會先發制人,去接水,其他人則會坐在座位上繼續觀察。

這些成功人士想知道他們什麼時候能接完水吃到泡麵。

第一行:兩個整數n,p

第二行:n個非負整數ti​。

1000001≤n≤100000,1≤p≤108, 1≤ti​≤109。

共一行:n個非負整數,表示每位成功人士回到座位的時間。
input

5 31 3 5 7 9

output

4 7 10 13 16

題意:看這樣一組樣例:

input

5 36 7 1 2 4

output

10 13 4 7 16

首先找到座位號為3的人,記錄當前時刻ans=1+3=4,然後看ti<=4的(有座位號4和5),在裡面找乙個最小的元素 找到座位號為4的,當前時刻ans=4+3=7,所以在時刻7時,等待的人有1號,2號,5號,選擇座位號靠前的人,1號,當前時刻為 ans=7+3=10……

思路:(1)第一步:選取最先起來泡麵的人。將現在的時間記為ans=p+ti。

(2)第二步:將ti(3)第三步:取佇列的頭,更改ans的值。

注意:(1)為了減少時間,不能每次都遍歷一遍找當前ti最小的人,所以需要在最開始將陣列按照ti排序。用乙個poss標記一下當前遍歷到的位置,這樣就相當於只走了一遍陣列,不用在每次迴圈找不在佇列裡面並且最靠前的元素了。最後輸出時在按照座位號排序回來。

(2)如果樣例只過了百分之60,那可能就是沒有考慮佇列元素為空時需要在找乙個最小的元素記錄。如樣例

input

5 310 20 30 40 50

output

13 23 33 43 53

具體看**:

#include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

struct a

}a[100100]; //優先佇列(按結構體中的x從小到大排序)

priority_queue q;

bool cmp(a p,a q)

sort(a+1,a+n+1,cmp);//首先按照起始時間排序

for(int i=1;i<=n;i++)

a[1].e=f+a[1].s;

ll ans=a[1].e;

int poss=2;//按照起始時間排序後當前遍歷到**的位置

while(1)

else

}if(poss>n&&q.empty())

break;

if(q.size()==0)

while(!q.empty())

}sort(a+1,a+n+1,cmp1);//最後按照座位號在排序回來

cout

return 0;

}

優先佇列(3道優先佇列問題)

優先佇列是一種十分強大的資料結構,它保持了一種動態的有序性,對於不斷改變有入隊的操作,而又需要某種最大或最小的操作的問題是再合適不過了,通常優先佇列的實現是由最小堆或者最大堆完成的,並通過堆排序保持佇列的有序性,模擬佇列的結構,在實際比賽中要寫乙個堆排序還是要一定的時間的,但是stl中queue容器...

佇列以及優先佇列

1.佇列 佇列的定義 標頭檔案 include 佇列是一種先進先出的資料結構 佇列的宣告 queueq 宣告字元型別 queueq 宣告結構體型別 以及可以宣告一些自定義的型別 佇列的操作 入佇列 s.push x 出佇列 s.pop 返回佇列的資料數量 s.size 判斷佇列是否為空 s.empt...

堆疊,佇列,優先佇列

包含標頭檔案 include定義 stacks 特點 先進後出。即 像瓶子一樣。先進來的資料在底部。例 輸入 1 2 3 4 5 輸出 5 4 3 2 1 棧的基本操作 s.push a 把元素a入棧。s.pop 刪除棧頂元素。s.top 返回棧頂元素,但不會刪除。s.size 返回棧中元素個數。s...