POJ2431 数据结构 (优先队列)

题目概述:

这道题是说一辆小车每单位长度露单位油,然后就这么开呀开呀想要到距离为L的另一个城镇去。路上有一些加油站,每个加油站距离目标城镇的距离给了,能加的油给了,判断最少需要的加油次数。

算法思想:

嗯大概是这样,我们该如何找到最少的加油次数呢。

答案是将加油站看成“备胎”,所以当小车每经过一个加油站,都要将这个加油站能加的油记载到某个容器里面,然后再在需要的时候把它提出来加油。

嗯好的,问题的关键来了,这个容器是什么。我们要思考,提出来加油的时候提的有什么特征,仔细贪心一下,每次提出都应该是提出加油最大的出来,这样的话才可以尽量少的加油。

当队列为空并且没有达到最后目标的话那就说明到达不了也就是错了。

代码部分:

#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;

struct node {
	int a, b;
};
node ar[10086];

bool cmp(const node &n1, const node &n2) {
	return n1.a < n2.a;
}

int main() {
	int n;
	cin >> n;
	priority_queue<int> q;
	for (int i = 0; i < n; i++) {
		cin >> ar[i].a >> ar[i].b;
	}
	sort(ar, ar + n, cmp);
	int l, p;
	cin >> l >> p;
	int cur = p, res = 0;
	int fuel_index = n-1;
	bool get = true;
	while (cur < l) {
		while (l-ar[fuel_index].a <= cur && fuel_index >= 0) {
			q.push(ar[fuel_index].b);
			fuel_index--;
		}
		if (cur >= l) {
			break;
		}
		if (q.empty() && cur < l) {
			get = false;
			break;
		}
		cur += q.top();
		q.pop();
		res++;
	}
	if (!get) cout << -1 << endl;
	else cout << res << endl;
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值