貪心+優先佇列維護(POJ2431)
阿新 • • 發佈:2018-12-11
題目大意:
你需要駕駛一輛卡車行駛L距離,最開始時,卡車上有P的汽油,卡車每開1單位距離需要消耗1單位的汽油。在途中有N個加油站,第i個加油站在距離起點Ai距離的地方,最多可以給卡車加Bi汽油,假設卡車的容量是無限大的,無論加多少油都沒有問題。求卡車到達終點需要加的最少的汽油。
思路:
可以換個思路:**在到達加油站i時,就獲得了一次在之後的任何時候都可以加Bi單位汽油的權利。**而在之後需要加油的時候,就認為是在之前經過的加油站加的油就可以。
#include<iostream> #include<queue> #include<cstdio> #include<algorithm> using namespace std; const int maxn=1e6+5; int n,l,p; int A[maxn],B[maxn]; void solve() { priority_queue<int> que; A[n]=l; B[n]=0; ll ans=0,pos=0,tank=p; for(int i=0;i<n+1;i++) { int d=A[i]-pos; // cout<<d<<' '; while(tank-d<0) { if(que.empty()) { puts("-1"); return ; } tank+=que.top(); que.pop(); ans++; } tank-=d; // cout<<tank<<' '<<endl; pos=A[i]; que.push(B[i]); } printf("%d\n",ans); } int main() { cin>>n; for(int i=n-1;i>=0;i--) { int x,y; cin>>x>>y; A[i]=25-x; B[i]=y; } sort(A,A+n); cin>>l>>p; solve(); return 0; }