POJ2431 优先队列+贪心

来源:互联网 发布:青岛乐智网络 编辑:程序博客网 时间:2024/06/07 11:24

题目大意:

见《挑战程序设计竞赛》P74。

我的理解:

优先队列+贪心

注意把输入的距离(加油站到终点)改为起点到加油站。

因为求得是最优解,需要尽可能少的加油站,所以我们每次希望去加油的时候 加最大的那个,因而将加油站push进priority_queue(堆结构,默认每次弹出最大值)

在到达加油站 i 时,就获得了一次在之后的任何时候都可以在加 stop[i].second 单位汽油的权利。

我的代码:

#include <iostream>#include <cstdio>#include <queue>#include <algorithm>#define MAX_N 10010using namespace std;typedef pair<int,int> P;int L,p,N;P stop[MAX_N];int cmp(P p1,P p2){return p1.first < p2.first;}void solve(){stop[N].first = L;stop[N].second = 0;N++;priority_queue<int> que;int ans = 0,pos = 0,tank = p;for(int i = 0;i<N;i++){int d = stop[i].first - pos;while(tank-d < 0){if(que.empty()){puts("-1");return;}tank += que.top();que.pop();ans++;}tank -= d;pos = stop[i].first;que.push(stop[i].second);}cout<<ans<<endl;}int main(){freopen("D:/OJ/挑战程序设计竞赛/POJ2431.txt","r",stdin);while(scanf("%d",&N) != EOF){for(int i = N-1;i>=0;i--){cin>>stop[i].first>>stop[i].second;}cin>>L>>p;for(int i = 0;i<N;i++){stop[i].first = L-stop[i].first;//cout<<A[i]<<" "<<B[i]<<" ";}sort(stop,stop+N,cmp);solve();}return 0;}

原创粉丝点击