链接:http://poj.org/problem?id=2431
当燃料用完后,选择经过的所有加油站中能加的油最多的..
所以,在之后需要加油时,就认为在之前经过的加油站加油就可以了..优先队列
#include <iostream> #include<queue> #include<algorithm> using namespace std; class fuel { public: int dis; int amt; }; bool cmp(fuel a,fuel b) { return a.dis<b.dis; } fuel data[10005]; int l,p,n; int solve() { data[n].amt=0; data[n].dis=l; n++; priority_queue<int> que; int i; int d,tank,pos,ans; tank=p; pos=0; ans=0; for(i=0;i<n;i++) { d=data[i].dis-pos; while(tank-d<0) { if(que.empty()) return -1; tank+=que.top(); que.pop(); ans++; } tank-=d; pos=data[i].dis; que.push(data[i].amt); } return ans; } int main() { int i; while( cin>>n) { for(i=0;i<n;i++) cin>>data[i].dis>>data[i].amt; cin>>l>>p; for(i=0;i<n;i++) data[i].dis=l-data[i].dis; sort(data,data+n,cmp); cout<<solve()<<endl; } return 0; }