POJ2431 探險 解題報告

2021-07-15 10:28:02 字數 1419 閱讀 3704

【問題描述】  

一群奶牛搶了一輛卡車決定前往樹林裡探險。但是由於他們的駕駛技術太糟,油箱在路上弄破了,所以他們每前進乙個單位的路程就會漏掉乙個單位的油。為了修好油箱,奶牛們必須前往最近的城市(不會超過1000000單位路程)。在當前位置和城市之間有n個加油站,奶牛可以在加油站加1到100單位的油。 

對於人來說,樹林是危險的地方,對奶牛來說,更是這樣,所以奶牛門盡可能的少停站加油,幸運的是,這輛卡車的油箱非常大,你可以認為它的容量是無限大的。卡車在離城市p單位時還有l個單位的油。 

你要計算出奶牛們至少要停幾站才能到城市,或者奶牛們根本到不了城市。

【輸入格式】  

第一行乙個整數n,接下來的n行,每行包含兩個用空格隔開的整數,分別表示該加油站離城市的距離和最多可以加多少油。最後一行包含的兩個整數為p和l。

【輸出格式】  

如果卡車能到達城市,輸出最少要停的次數,否則輸出-1。

【輸入樣例】   

44 4

5 211 5

15 10

25 10

【輸出樣例】  

2【樣例解釋】  

現在卡車離城市25個單位,卡車離有10個單位的油。在路上,有4個加油站,分別距離城市4,5,11,15,分別距離卡車則為21,20,14,10。這些加油站分別最多可加油4,2,5,10個單位。 

開10個單位,加滿10單位油,再開4個單位,加滿5單位油,接著直接開到城市。

【資料範圍】  

0解題思路:本題的主要演算法是貪心演算法,貪心策略為每次在卡車能經過的加油站中,選擇所加油量最大的加油站加油,直到卡車能到達城市。所以,我們可以先將每個加油站按離城市的距離由大到小排序,先找出當前卡車能開到的加油站(假設卡車將油耗盡所到的離城市的距離為r,依次比較加油站到城市的距離是否大於或等於r,如果是,則滿足條件),在滿足條件的加油站中選擇所加油量最大的(這裡可以使用優先佇列,方便查詢),然後重複上述操作。需要注意的是,該題要判斷無解情況,在找當前卡車能開到的加油站時,如果優先隊列為空,並且第乙個所比較的加油站到城市的距離小於r,則說明卡車不能到達城市,需輸出-1。

#include#include#include#include#include#include#includeusing namespace std;

const int maxn=10005;

int n,p,l;

struct data

;data a[maxn];

bool cmp1(data aa,data bb) //按加油站離城市的距離由大到小排序

struct cmp2

if(!q.empty())

}if(ok==0) printf("-1\n");

else printf("%d\n",cnt);

}int main()

POJ 2431(優先佇列)

題意 從起點到終點距離為n,走1單位路程消耗1單位油,路上會有m個加油站分別出現在si的位置,路過加油站時可以選擇是否加油。問到達加油站最少需要加幾次油,不能到輸出 1.分析 整體上來看,汽車每經過乙個加油站就擁有了在這個加油站加油的能力,可以將加油站加入優先佇列,沒油時優先選取大的。收穫 路過即獲...

復健運動poj2431

題目大意 一頭牛從起點到終點,最開始有p公升油,每走一公里漏一公升油,路途上有許多加油點,油箱容量為無窮大,求能到終點的最小加油次數。挑戰程式設計競賽 建議首先處理輸入資料,使之成為到起點的距離。優先佇列練習 用優先佇列儲存路過的加油點的油。每次取用最大值,這樣會使加油次數儘量減少。每取出一次就an...

POJ2431 優先佇列 貪心

題目大意 見 挑戰程式設計競賽 p74。我的理解 優先佇列 貪心 注意把輸入的距離 加油站到終點 改為起點到加油站。因為求得是最優解,需要盡可能少的加油站,所以我們每次希望去加油的時候 加最大的那個,因而將加油站push進priority queue 堆結構,預設每次彈出最大值 在到達加油站 i 時...