POJ2431 二叉堆(优先队列)以及贪心算法

来源:互联网 发布:阿里云dns 地址 编辑:程序博客网 时间:2024/05/22 06:06

题目大意:

汽车从远处行驶向一个城镇,路途很远,汽油不足,沿途有一些加油站,给出加油站的位置和存油,在汽车油箱无限大的情况下求出所需加油次数最少为多少。

分析:

由于要加油的次数最少,因此最好是一次加的油量尽量多,而每次经过一个加油站,可以看做,今后可以在任意时刻使用这个站来加油,因此把当前汽油可达的加油站存入一个堆中,每次没油的时候从中取出最多的那次,当堆中没有油的时候就输出-1.

注意加油站的位置是距离城镇的位置

我想吐个槽。。。ACM题中的cows是宇宙间最聪明最傻缺最无理的生物。。。

#include<iostream>#include<queue>#include<algorithm>using namespace std;struct st{int dist;int fule;bool operator < (const st & o)const{return dist>o.dist;}}stop[10002];int main(){int i,j,k;int pos,p,l;int d;priority_queue< int > que;int n;int ans;while(scanf("%d",&n)!=EOF){stop[0].dist=0;stop[0].fule=0;for(i=1;i<=n;i++){scanf("%d%d",&stop[i].dist,&stop[i].fule);}sort(stop,stop+n+1);scanf("%d%d",&l,&p);pos=l;ans=0;for(i=0;i<=n;i++){d=pos-stop[i].dist;while(d>p){if(!que.empty()){p+=que.top();que.pop();ans++;}else{printf("%d",-1);return 0;}}pos=stop[i].dist;p-=d;que.push(stop[i].fule);}printf("%d",ans);}}


原创粉丝点击