欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【小白爬POJ2431】3.6 探险车加油问 Expedition

程序员文章站 2022-04-24 12:45:12
...

【小白爬POJ2431】3.6 探险车加油问题 Expedition


POJ2431 hard\color{#FF0000}{hard}

点击进入原题链接:POJ2431 Expedition

题目

Description

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.

思路

图片来源:点击进入bilibili原视频

**贪心思想:**我们在油量耗尽的时候加油,每次加油选择最大的加油站(用最大堆记录所有没有加过油的站),这样就可以保证加油次数最少。
难点在于:

  1. 当油量耗尽的时候,往前回溯可能需要加不止一次油才能满足往后走,因此需要一个while循环;
  2. 加油的时候,搜索的范围是所有没有加过油的加油站,包括之前选过的加油站之前的加油站
    【小白爬POJ2431】3.6 探险车加油问 Expedition
    代码如下:
bool cmp(const std::pair<int,int>&a,const std::pair<int,int>&b){ //由于每个加油站给的是一个对pair,第一个数字是到终点的距离,第二个数字是可以加的油,所以这里指定排序规则,按照到终点的距离对站点进行降序排列(从远到近)
	return  a.first>b.first;
}
int get_minimum_stop(int L, int P, std::vector<std::pair<int,int>>&stop){
	std::priority queue<int,std::vector<int>,std::less<int>> Q;
	int result = 0; //加油次数
	stop.push_back(std::make_pair(0,0)); //把终点也当作一个站点,到终点距离为0,可以加的油量也为0
	std::sort(stop.begin(),stop.end(),cmp); //对pair进行排序
	P = 0; //油箱里的油,初始值为0;
	for(int i=0;i<stop.size();i++){ //一个一个站点过
		int dis = L-stop[i].first; //计算站点之间的距离
		while (P < dis && !Q.empty()) {
			P += Q.top(); //选择最大加油量的站点
			Q.pop();
			result++; //加油数加一
		}
		if (P<dis && Q.empty()) {
			return -1; //所有可以加油的站点都加了,还是到不了终点
		}
		P -= dis; //消耗汽油
		L = stop[i].first; //前进到当前站点
		Q.push(stop[i].second); //向堆里加入当前站点可加入的油量
	}
	return result; //返回加油次数
}