题意:一辆卡车距离重点L,现有油量P,卡车每前行1米耗费油量1,途中有一些加油站,问最少在几个加油站加油可使卡车到达终点或到达不了终点。
思路:运用优先队列,将能走到的加油站的油量加入优先队列中,油不够时加入优先队列中数值最大的油,如果油不够时队列里为空则到达不了。
#include<cstdio> #include<queue> #include<algorithm> using namespace std; priority_queue<int> que; struct Stop { int dis,fuel; }stop[10010]; bool cmp (Stop a,Stop b) { if(a.dis==b.dis) return a.fuel>b.fuel; return a.dis<b.dis; } int main() { int n,L,p; while(~scanf("%d",&n)) { for(int i=0;i<n;i++) { scanf("%d%d",&stop[i].dis,&stop[i].fuel); } scanf("%d%d",&L,&p); for(int i=0;i<n;i++) { stop[i].dis=L-stop[i].dis; } sort(stop,stop+n,cmp); stop[n].dis=L;stop[n].fuel=0; int cnt=0,pos=0,flag=0; for(int i=0;i<=n;i++) { int d=stop[i].dis-pos; while(p<d) { if(!que.empty()) { p+=que.top(); que.pop(); cnt++; }else break; } if(p<d) { flag=1; puts("-1");break; } p-=d; que.push(stop[i].fuel); pos=stop[i].dis; } if(flag==0) printf("%d\n",cnt); while(!que.empty()) que.pop(); } return 0; }
时间: 2024-10-08 17:02:13