PAT甲级 贪心 1033

本文详细解读PAT甲级题1033的贪心解法,探讨如何寻找较远且油价更低的加油站进行加油,以最大化利益。通过分析,解释了在无法找到更低油价时,应加满油前往当前最便宜的加油站,确保行程中使用更多低价油。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1033. To Fill or Not to Fill (25) [贪心算法]
柳神题解:
贪⼼心思想:
0.寻找⽐比⾃自⼰己距离远的,到能够到达的⼤大距离之间的加油站,看他们的油价。如果找到了了更更低价格 的油价,就加油到刚好能到达那个加油站的距离的油,然后去那个更更低价格的加油站(有更更低的我⼀一 分都不不想多花在别的距离上,只加到刚好满⾜足更更低价格的加油站的距离就⾏行行,那样以后的路路程我就可 以以更更低的价格⾏行行驶啦)
1.如果找不不到更更低的,就找尽可能低的油价的加油站,在当前加油站加满油之后过去。因为想要让路路 程上使⽤用的尽可能是低价的油,既然没有⽐比当前更更低价格的了了,就让油箱加到⼤大值,这样能保证利利 益⼤大化,保证⼤大的距离使⽤用的是便便宜的油。

详解见注释和图片:

#include <iostream>
#include <algorithm>
#include <vector>
#include <stdio.h>
using namespace std;

double C, D, d; //C邮箱容量,D总距离,d单位油耗跑的距离
int N;
const int INF = 999999;
struct station
{
	double price, dis;
};
vector<station> vec;

bool cmp(station a, station b)
{
	return a.dis < b.dis;
}

int main()
{
	cin >> C >> D >> d >> N;
	for (int i = 0; i < N; i++)
	{
		station s;
		cin >> s.price >> s.dis;
		vec.push_back(s);
	}
	station distination;
	distination.dis = D;
	distination.price = 0;
	vec.push_back(distination);//把目的地也加进去,为了保证逻辑统一
	sort(vec.begin(), vec.end(), cmp); //按距离远近排序


	double nowdis = 0.0, maxdis = 0.0, nowprice = 0.0,
		totalprice = 0.0;
	double leftdis = 0.0; //强行跑停时,油箱里面还剩的油够跑的距离


	if (vec[0].dis != 0)
		cout << "The maximum travel distance = 0.00";
	else
		nowprice = vec[0].price;  //目前价格就是第一个站的价格

	while (nowdis < D) //到目的地之前
	{
		maxdis = nowdis + d * C;
		double minPriceDis = 0, minPrice = INF; //最便宜站点的位置,最便宜的具体价格

		int flag = 0;
		for (int i = 0; i <= N && vec[i].dis < maxdis; i++) //能到达的所有站点 !!!注意要把最后目的地也算进去!
		{
			if (vec[i].dis <= nowdis)  //已经经过了 !!!!注意等于号,不然把自己包括进去,在6.85那里死循环
				continue;
			if (vec[i].price < nowprice) //比当前更便宜,马上去那个站点(因为哪怕有更便宜的,也可以省一部分了)
			{
				totalprice += (vec[i].dis - nowdis - leftdis) * nowprice / d; //leftdis 油箱中可能剩了一部分油
				leftdis = 0.0; //去到那个更优站点,我需要耗尽目前的全部贵的油更划算
				nowprice = vec[i].price;
				nowdis = vec[i].dis;
				flag = 1; //找到了更便宜的
				break;   
			}

			if (vec[i].price < minPrice) //找到范围内最便宜的站点值
			{
				minPrice = vec[i].price;
				minPriceDis = vec[i].dis;
			}
		}


		if (flag == 0 && minPrice != INF) //如果没找到比当前便宜的
		{
			totalprice += (nowprice * (C - leftdis / d)); //总容量减去剩下的邮箱容量
			leftdis = C * d - (minPriceDis - nowdis);
			nowprice = minPrice;
			nowdis = minPriceDis;
		}
		if (flag == 0 && minPrice == INF) //找不到新的站点了
		{
			nowdis += C * d;  //跑完油箱里的油就G
			printf("The maximum travel distance = %.2f", nowdis);

			return 0;
		}
	}
	printf("%.2lf", totalprice);

	return 0;
}

在这里插入图片描述

### 关于 PAT 甲级 1024 题目 PAT (Programming Ability Test) 是一项编程能力测试,其中甲级考试面向有一定编程基础的学生。对于 PAT 甲级 1024 题目,虽然具体题目描述未直接给出,但从相似类型的题目分析来看,这类题目通常涉及较为复杂的算法设计。 #### 数据结构的选择与实现 针对此类问题,常用的数据结构包括但不限于二叉树节点定义: ```cpp struct Node { int val; Node* lchild, *rchild; }; ``` 此数据结构用于表示二叉树中的节点[^1]。通过这种方式构建的二叉树能够支持多种遍历操作,如前序、中序和后序遍历等。 #### 算法思路 当处理涉及到图论的问题时,深度优先搜索(DFS)是一种常见的解题策略。特别是当需要寻找最优路径或访问尽可能多的节点时,结合贪心算法可以在某些情况下提供有效的解决方案[^2]。 #### 输入输出格式说明 根据以往的经验,在解决 PAT 类型的问题时,输入部分往往遵循特定模式。例如,给定 N 行输入来描述每个节点的信息,每行按照如下格式:“Address Data Next”,这有助于理解如何解析输入并建立相应的数据模型[^4]。 #### 数学运算示例 有时也会遇到基本算术表达式的求值问题,比如分数之间的加减乘除运算。下面是一些简单的例子展示不同情况下的计算结果: - \( \frac{2}{3} + (-2) = -\frac{7}{3}\) -2) = -\frac{4}{3}\) - \( \frac{2}{3} ÷ (-2) = -\frac{1}{3}\) 这些运算是基于样例提供的信息得出的结果[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值