【蔚来汽车】蔚来20220713第三题-旅游规划
【蔚来汽车】蔚来20220713第三题-旅游规划
牛牛对 n 个城市旅游情况进行了规划,已知每个城市有两种属性 x 和 y ,其中 x 表示去第 i 号城市的花费,y 表示在第 i 号城市游玩后会得到的开心值。
现在牛牛希望从中挑选出一些城市去游玩,但挑选出的城市必须满足任意两个城市之间花费差值的绝对值小于 k
请你帮他计算出在满足上述条件下能得到最大的开心值是多少
输入描述:
第一横输入两个整数 n 和 k
接下来 n 行,每行输入两个整数 x 和 y ,分别表示每个城市的两种属性
1 < n <= 100000
1 < k <= 1000000000
0 < x,y <= 1000000000
输出描述:
输出一个整数表示答案
示例输入:
5 3
1 3
2 1
5 2
3 1
4 3
示例输出:
6
思路
先根据城市的花费进行排序得到城市序列,经过分析可以知道:
- 要得到最大的开心值,选择旅游的城市必然是连续的一段;(如果不连续,比如选择了排序后的第【2】、【4】、【5】个城市,那么再加上第【3】个城市肯定也满足任意两个城市之间花费差值的绝对值小于 k,并且开心值更大)
- 对于连续的城市序列,任意两个城市之间花费差值的绝对值小于 k等价于最大和最小的城市花费之间差值的绝对值小于 k
因此求解问题转为找到一段连续序列的开头和结尾,使得城市序列的开心值最大。
题解
import sys
for line in sys.stdin:
a = line.split()
n = int(a[0])
k = int(a[1])
city = []
for i in range(n):
city.append(list(map(int, input().split())))
city.sort(key=lambda x: x[0])
maxhappy = 0
curhappy = 0
# 滑动窗口法
for i in range(n):
curhappy = city[i][1]
j = i + 1
while j < n and city[j][0] - city[i][0] < k:
curhappy += city[j][1]
j += 1
maxhappy = max(maxhappy, curhappy)
print(maxhappy)