第五天知识点学习

优先队列的使用

#include <queue>
#include <cstdio>
using namespace std;
int main() { 
	priority_queue<int>a;
	
	//插入元素
	a.push(3);
	a.push(5);
	a.push(6);
	
	//不断循环 到空为止
	while(!a.empty()){
		printf("%d\n",a.top());
		a.pop();
	} 
	return 0;
} 

输出结果:6 5 3

需要运用优先队列的题目

在这里插入图片描述
样本输入

4
4 4
5 2
11 5
15 10
25 10

样本输出

2

暗示

输入详细信息:

卡车距离镇区25个单位;卡车有10单位燃料。沿着这条道路,在距城镇4、5、11和15的距离处有4个加油站(因此,这些停车站最初距卡车的距离为21、20、14和10)。这些加油站最多可分别供应4、2、5和10个单位的燃料。

输出详细信息:

开车10个单位,停下来获取10个单位以上的燃料,再开车4个单位,停下来获取5个单位以上的燃料,然后开车到城镇。


因为数量N比较大 所以要考虑如何计算比较高效
这道题相当于我要喝水 经过多少路程我就缺水了 但是我已经经过了好几个站点了 身上已经背着大大小小的水壶

肯定首先选最大的水壶能撑多久撑多久啦 这样子喝水的次数才会是最少
为了高效地进行操作 我们就可以使用从大到小依次取出数值的优先队列

% 当经过加油站 i 时,往优先队列里加入Bi;
% 当燃料箱空了时

1. 如果优先队列也是空的,则无法到达终点
2. 否则取出队列中最大元素给卡车加油

不多说 直接上代码块

int L,P,N;
int A[MAX_N+1],B[MAX_N+1];

void solve(){
	//为了写起来方便 将终点也认为是加油站
	A[N]=L;
	B[N]=0;
	N++;
	
	//维护加油站的优先队列
	priority_queue<int> que;
	
	//ans:加油次数,pos:现在所在的位置 tank:油箱中油的量
	int ans=0,pos=0,tank=P;
	
	for(int i=0;i<N;i++){
		//接下去要前进的距离
		int d=A[i]-pos;
		
		//不断加油直到油量足够行驶到下一个加油站
		while(tank-d<0){
			if(que.empty()){
				puts("-1");
				return;
			}
			tank+=que.top();
			que.pop();
			ans++;
		} 
		tank-=d;
		pos=A[i];
		que.push(B[i]);
	} 
	printf("%d\n",ans);
} 

顶不住了 继续欠债吧。。

晚安

发布了16 篇原创文章 · 获赞 0 · 访问量 118

猜你喜欢

转载自blog.csdn.net/weixin_44745441/article/details/103396361