洛谷P3406 海底高铁题解

该博客介绍了如何通过记录铁路路段通行次数,利用差分和前缀和计算最小乘车费用的问题。作者提供了一种思路和相应的C++代码实现,通过比较办卡和买票的费用来确定最低成本。

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

题目

题目地址
如果没有看懂的话,可以再参考一下这个代佬的博客 木南传送门

题目大意:

uim坐车出差,每过一个站有两种坐车方式,一种是买票,还有一种是刷卡,刷卡的钱肯定比买票的要便宜,但是办卡要花钱,每一个站办的卡只能在那一段铁路使用。我们需要得到uim出一次差花费最少是多少钱

思路

这道题我们可以通过记录通过第i段铁路的次数,然后比较办卡加刷卡的费用买票哪个更便宜。
记录通过第i段铁路的次数可以用差分加前缀和

代码

#include <bits/stdc++.h>
#include <iostream>
#include <algorithm>
#include <queue>
#define ll long long
#define mem(s, i) memset(s, i, sizeof(s))
#define INF 0x3f3f3f3f;
using namespace std;
const int N = 1e5 + 5;
int p[N];
ll ans[N];
//结构体记录通过第i段铁路的各种费用
struct node
{
	int a, b, c;
} s[N];
void solve()
{
	mem(p, 0);
	mem(ans, 0);
	int n, m;
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= m; i++)
	{
		scanf("%d", &p[i]);
	}
	for (int i = 1; i < n; i++)
	{
		scanf("%d%d%d", &s[i].a, &s[i].b, &s[i].c);
	}
	//得到从l站到r站通过的站台的次数
	for (int i = 1; i < m; i++)
	{
		ans[min(p[i], p[i + 1])]++;
		ans[max(p[i], p[i + 1])]--;
	}
	for (int i = 1; i <= n; i++)
	{
		ans[i] += ans[i - 1];
	}
	ll Sum = 0;
	for (int i = 1; i < n; i++)
	{
		Sum += min(s[i].a * ans[i], (s[i].c + ans[i] * s[i].b));
	}
	printf("%lld\n", Sum);
}
int main()
{
	ios::sync_with_stdio(false);
	solve();
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值