车子拥有无限容量的油箱,每走一个单位就漏一点油(走1米漏1升之类的,总之是一比一关系),给n个加油站,给每个加油站到终点的距离和加油站存了多少油,问加油次数最少是多少。
用优先队列来写,无限油箱直接看成他容量与路程一样,把每个加油站的距离到终点的距离从大到小排序,这样就成了车子距离加油站的距离的从小到,然后判断车子的油量够不够到下一个加油站或者他能跨过多少个加油站,如果跨过了加油站,就把跨过的加油站的油量给压进优先队列,之后到下一个加油站油不够时,跳出top的最大油量加上,加油次数++。
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
struct node{
int l;//距离
int p;//有多少油量
};
bool cmp(node a,node b)
{
return a.l>b.l;
}
node a[10005];
int main()
{
int n,far,tank;//距离城镇距离,当前油箱剩余
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i].l>>a[i].p;
cin>>far>>tank;
sort(a,a+n,cmp);
/*
for(int i=0;i<n;i++)
cout<<a[i].l<<" "<<a[i].p<<endl;
*/
priority_queue<int>q;
int ans=0;
a[n].l=a[n].p=0;
for (int i = 0; i <= n; i++)
{
int t=far-a[i].l;//到下一个油站的距离
tank-=t;//到这里要花多少油
while (tank<0)//油不够到过去节点里面最大的油箱里面取
{
if (q.empty())//过去没有加油站
{
cout<<-1<<endl;
return 0;
}
tank+=q.top();//加油
q.pop();//取完这个加油站的全部油
ans++;
}
far=a[i].l;//更新剩下的路程
q.push(a[i].p);//当前油站的油压入队列
}
cout<<ans<<endl;
return 0;
}
大的排序。之后进行选择