【蔚来汽车】蔚来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)
posted @ 2024-02-29 16:41  张天明  阅读(116)  评论(0编辑  收藏  举报