優先佇列的學習記錄--例題:Expedition(POJ2431)

Prime's Blog發表於2020-10-22

優先佇列的學習記錄--例題:Expedition--POJ2431


首先,什麼是優先佇列呢?
能夠完成下列操作的資料結構叫做優先佇列

□ 插入一個數值
□ 取出最小的數值(獲得數值,並且刪除)

當然,堆也能夠實現以上操作,但STL裡的priority_queue已經幫我們實現堆了,我們可以直接拿來使用。以下是一些操作的簡單實用

priority_queuepque //優先佇列的宣告
pque.push(x) //優先佇列的插入 插入一個整型的變數x
pque.top() //讀取優先佇列中最大的變數
pqie.pop() //刪除優先佇列中最大的變數

下面是一些實用priority的簡單例子:

#include<iostream>
#include<queue>
using namespace std;
priority_queue<int>pque; //宣告
int main()
{
	pque.push(3);  //優先佇列的插入  插入一個整型的變數3
	pque.push(5);  //優先佇列的插入  插入一個整型的變數5 
	pque.push(1);  //優先佇列的插入  插入一個整型的變數1
	
	while(!pque.empty()){  //判空 
		cout<<pque.top()<<" ";  //讀取最大的元素 
		pque.pop();      //刪除最大的元素 
	}
	return 0; 
} 

下面來個例題:
Expedition–POJ2431
你需要駕駛一輛卡車行駛L單位距離。最開始時,卡車上有Р單位的汽油。卡車每開1單位距離需要消耗Ⅰ單位的汽油。如果在途中車上的汽油耗盡,卡車就無法繼續前行,因而無法到達終點。在途中一共有N個加油站。第i個加油站在距離起點A;單位距離的地方,最多輸出最少的加油次數,否則輸出-1。
L限制條件
.1≤N≤10000
.1≤L≤1000000,1≤P≤1000000
.1≤A<=L,1≤B≤100
可以給卡車加B;單位汽油。假設卡車的燃料箱的容量是無限大的,無論加多少油都沒有問題。
那麼請問卡車是否能到達終點?如果可以,最少需要加多少次油?如果可以到達終點,輸出最少的加油次數,否則輸出-1。
樣例
輸入

N= 4,L= 25,P = 10
A = {10,14,20,21}
B = {10,5,2,4}

輸出

2(在第1個和第2個加油站加油)

程式碼描述

#include<bits/stdc++.h>
using namespace std;
int n,l,p,pos,ans;  //pos記錄當前位置 
int a[10005],b[10005];
priority_queue<int>pque;
int main()
{
	cin>>n>>l>>p;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){
		cin>>b[i];
	}
	
	for(int i=1;i<=n;i++){
		int d=a[i]-pos;
		while(p-d<0){
			if(pque.empty()){
				cout<<"-1";
				return 0;
			}
			p+=pque.top();
			pque.pop();
			ans++;
		}
		pque.push(b[i]);
		pos=a[i];
		p-=d;
	}
	 cout<<ans;
	 return 0;
}

相關文章