题意:一辆汽车由起点开往小镇,总路程为L,路上有N个加油站,第i个加油站距离小镇a[i],最多可为提供b[i]的汽油,汽车开始时有P单位汽油,问汽车内否到达小镇,若能到达输出最小的加油次数。
思路:每经过一个加油站i,汽车就获得了一次在任何时候加油b[i]的权利,当汽车不足以到达下一站时,就加入过往的最大的b值。
#include<stdio.h> #include<queue> #include<iostream> #include<algorithm> #include<math.h> #include<string.h> #define INF 0x3f3f3f3f #define LL long long #define MOD 100000007 #define MAXSIZE 20005 using namespace std; struct node { int a,b; }p[MAXSIZE]; int cmp(struct node A,struct node B) { if(A.a != B.a) return A.a < B.a; return A.b > B.b; } int Solve(int n,int l,int k) { priority_queue<int> Q; int ans=0,pos=0,hav=k; for(int i=0;i<=n;i++) { int d = p[i].a - pos; while(hav - d < 0) { if(Q.empty()) { return -1; } hav += Q.top(); Q.pop(); ans++; } hav -= d; pos = p[i].a; Q.push(p[i].b); } return ans; } int main() { int n,l,k; while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) { scanf("%d%d",&p[i].a,&p[i].b); } scanf("%d%d",&l,&k); for(int i=0;i<n;i++) p[i].a = l - p[i].a; p[n].a = l; p[n].b = 0; sort(p,p+n,cmp); int ans = Solve(n,l,k); printf("%d ",ans); } return 0; }