感覺這個思路還是很巧妙的。。。經過每乙個加油站的時候你無法知道這時候加油能不能保證得到的是符合題意的最優解,所以就需要換乙個角度來思考,因為在加油站時無法判斷,那麼乾脆就直接走到沒油,回過頭來判斷走過的加油站裡**需要加油,這裡就比較容易想到肯定是盡可能的選擇能加油最多的點進行加油,這樣才能夠保證最少的點。這樣就可以看出需要運用到優先佇列的知識了,走到沒油的時候,將之前沒有加入佇列的加油站都加入佇列,再從中選擇油量最大的那個進行加油,直到走完或者沒辦法再進行加油。
挑戰上面是說經過加油站的時候,往優先佇列之中加入該點的油量,如果油箱空了且佇列也是空的,那麼就到不了,如果油箱空了佇列中有元素,那麼就取出最大的進行加油。
我跟書上的實現方法是不一樣的。我是直接類似模擬車的移動,起始位置直接在最初油箱的容量中,然後將當前位置之前的加油站都加入到優先佇列之中去,每次取出最大的進行加油,並更新當前位置。直到到達終點或者根本沒辦法再加油。
書上大概的意思就是遍歷每乙個加油站,當前位置到下乙個加油站還需要多少油,如果剩餘的油不夠就從佇列中取出來加油,直到滿足到達下乙個加油站,如果沒辦法到就直接退出了,然後再更新油箱中的剩餘的油量,並更新當前位置。(書上有個比較巧妙的地方在於將終點也直接設成乙個加油站,只不過他不能加油,這樣統一起來直接遍歷加油站就好了)
我的實現方式:
#include #include #include #include #include using namespace std;
#define m 10009
struct node
st[m];
int cmp(node x,node y)
int main()
int l,p;
scanf("%d %d",&l,&p);
for(int i = 0;i < n;i++)
st[i].a = l-st[i].a;
sort(st,st+n,cmp);
int cur = p,ans = 0; //cur表示當前位置
int i = 0;
priority_queueq;
while(cur=l) //到達終點了
printf("%d\n",ans);
else
printf("-1\n");
}return 0;
}
書:
#include #include #include #include #include using namespace std;
#define m 10009
struct node
st[m];
int cmp(node x,node y)
int main()
int l,p;
scanf("%d %d",&l,&p);
for(int i = 0;i < n;i++)
st[i].a = l-st[i].a;
sort(st,st+n,cmp);
int cur = 0,ans = 0; //當前位置初始化為零
int i = 0;
priority_queueq;
st[n].a = l; //將終點也看做乙個加油站
st[n].b = 0;
n++;
for(int i = 0;i < n;i++)
p += q.top(); //加油
q.pop();
ans++;
}p -= d; //消耗這麼多油,更新油箱剩餘的
cur = st[i].a; //到達下個加油站
q.push(st[i].b);
}printf("%d\n",ans);
}return 0;
}
POJ 2431(優先佇列)
題意 從起點到終點距離為n,走1單位路程消耗1單位油,路上會有m個加油站分別出現在si的位置,路過加油站時可以選擇是否加油。問到達加油站最少需要加幾次油,不能到輸出 1.分析 整體上來看,汽車每經過乙個加油站就擁有了在這個加油站加油的能力,可以將加油站加入優先佇列,沒油時優先選取大的。收穫 路過即獲...
POJ2431 優先佇列 貪心
題目大意 見 挑戰程式設計競賽 p74。我的理解 優先佇列 貪心 注意把輸入的距離 加油站到終點 改為起點到加油站。因為求得是最優解,需要盡可能少的加油站,所以我們每次希望去加油的時候 加最大的那個,因而將加油站push進priority queue 堆結構,預設每次彈出最大值 在到達加油站 i 時...
POJ 2431 貪心 優先佇列
題意 一輛卡車距離重點l,現有油量p,卡車每前行1公尺耗費油量1,途中有一些加油站,問最少在幾個加油站加油可使卡車到達終點或到達不了終點。思路 運用優先佇列,將能走到的加油站的油量加入優先佇列中,油不夠時加入優先佇列中數值最大的油,如果油不夠時佇列裡為空則到達不了。include include i...