列表

详情


NC221820. 旅行家问题2

描述

显然,身为旅行家,爬山是他不能回避的问题。地图上存在 座高度 ,由于这些山实在是太高惹,他们的宽度和彼此之间的距离都可以忽略不计。每座山的山顶存在一个高为 的梯子,
他可以通过这个梯子到达高度可及的山顶,通俗的来说从高山i的山顶,可以转移到 的高山j的山顶上去,同时交付 的梯子使用费。
如果他想达到当前山顶的梯子高度所不能及的高山,他便需要搭乘飞机并交纳 的运输费。
旅行家从一号山出发,他需要访问所有高山并返回一号山,请你帮他设计一个路线,使他花费的费用最小。

输入描述

第一行包含一个整数 
接下来 行,第 行包括两个正整数 ,表示第 个山的高度,山顶梯子的长度。

输出描述

输出一个正整数,表示最小的花费。

示例1

输入:

3
1 9
2 1
4 1

输出:

11

说明:

最优的攀爬顺序:
从1到3号高山,使用梯子,总费用为9;
从3号到2号,使用梯子,总费用为10;
从2号到1号,使用梯子,总费用为11;

示例2

输入:

6
4 2
8 4
3 0
2 3
7 1
0 1

输出:

13

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 79ms, 内存消耗: 1260K, 提交时间: 2021-10-07 19:26:30

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
	pair <int, int> a[100010]; int n; ll ans = 0; cin >> n;
	for (int i = 0; i < n; i++) cin>>a[i].first>>a[i].second, ans += a[i].second;
	sort(a, a + n); int h = a[0].first + a[0].second;
	for (int i = 1; i < n; i++) { if (a[i].first > h) ans += a[i].first - h; h = max(h, a[i].first + a[i].second); }
	printf("%lld\n", ans);
	return 0;
}

上一题