牛牛在一輛有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...