Expedition
对应的中文版是: 最低加油次数
思路
-
由于只有中途的几个站点,我在开头和结尾都加上一个站点,那么问题就变成了能否从第一个站点到达最后一个站点,这样for里边就是加油站而不是所有的路程了
-
由于油箱是无限,那么每次加油肯定是把加油站所有的油都给加了,而且加的时候最好是找油量最多的加,这里使用的是优先队列,这样能省去查找最多油量的时间
#include<queue> priority_queue<int> pq;
-
从第二个站点开始,每到一个站点,查看下油箱里的油是否够到这个站点,如果够,就把这个加油站的油push进pq,如果不够,那就从pq里加油,一直加到能达到这个站点或者pq为空,pq空了那就是无法达到,然后继续往下一个站点走
a = zds[i-1].a-zds[i].a;// 从这个站点到上个站点走了多远 if(remain-a<0){ // 中途需要加油才能过来 while(!qs.empty()&&remain-a<0){ remain+=qs.top(); b++; qs.pop(); } if(remain-a<0){ cout<<"-1"; return 0; } } remain-=a; qs.push(zds[i].b);
对了,提上没说给出的站点一定是有序的,所以最好sort一下,而且给出的加油站距离是距离城镇的距离,不是距离奶牛的距离,需要处理下🤢
ac代码
#include<iostream> #include<queue> #include<algorithm> using namespace std; struct zd{ int a,b;// a:站点距离;b:站点油量 }zds[10000+10]; inline bool cmp(zd a,zd b){ return a.a>b.a; } priority_queue<int> qs;// 加油站,采用大顶堆 int main(){ // freopen("data.in","r",stdin); int n,remain,tot; cin>>n; for(int i=1;i<=n;i++){ cin>>zds[i].a>>zds[i].b; } cin>>tot>>remain; zds[0].a = 0; zds[0].b = 0; if(zds[n].a!=tot){ n++; zds[n].a = tot; zds[n].b = 10; } sort(zds,zds+n+1,cmp); int a,b=0,c; // b:加油的次数 for(int i=1;i<=n;i++){ a = zds[i-1].a-zds[i].a;// 从这个站点到上个站点走了多远 if(remain-a<0){ // 中途需要加油才能过来 while(!qs.empty()&&remain-a<0){ remain+=qs.top(); b++; qs.pop(); } if(remain-a<0){ cout<<"-1"; return 0; } } remain-=a; qs.push(zds[i].b); } cout<<b; return 0; }
题目: 把题目放后边,这样能通过题目搜到,还不妨碍看题解
A group of cows grabbed a truck and ventured on an expedition deep into the jungle. Being rather poor drivers, the cows unfortunately managed to run over a rock and puncture the truck's fuel tank. The truck now leaks one unit of fuel every unit of distance it travels.
To repair the truck, the cows need to drive to the nearest town (no more than 1,000,000 units distant) down a long, winding road. On this road, between the town and the current location of the truck, there are N (1 <= N <= 10,000) fuel stops where the cows can stop to acquire additional fuel (1..100 units at each stop).
The jungle is a dangerous place for humans and is especially dangerous for cows. Therefore, the cows want to make the minimum possible number of stops for fuel on the way to the town. Fortunately, the capacity of the fuel tank on their truck is so large that there is effectively no limit to the amount of fuel it can hold. The truck is currently L units away from the town and has P units of fuel (1 <= P <= 1,000,000).
Determine the minimum number of stops needed to reach the town, or if the cows cannot reach the town at all.
Input
* Line 1: A single integer, N
* Lines 2..N+1: Each line contains two space-separated integers describing a fuel stop: The first integer is the distance from the town to the stop; the second is the amount of fuel available at that stop.
* Line N+2: Two space-separated integers, L and P
Output
* Line 1: A single integer giving the minimum number of fuel stops necessary to reach the town. If it is not possible to reach the town, output -1.
Sample Input
4
4 4
5 2
11 5
15 10
25 10
Sample Output
2
Hint
INPUT DETAILS:
The truck is 25 units away from the town; the truck has 10 units of fuel. Along the road, there are 4 fuel stops at distances 4, 5, 11, and 15 from the town (so these are initially at distances 21, 20, 14, and 10 from the truck). These fuel stops can supply up to 4, 2, 5, and 10 units of fuel, respectively.
OUTPUT DETAILS:
Drive 10 units, stop to acquire 10 more units of fuel, drive 4 more units, stop to acquire 5 more units of fuel, then drive to the town.