一群朋友(小橙和他的朋友们)正在沿着高度为 h 的栅栏行走,他们想偷偷交谈,但不想被老师注意到。为了实现这一点,每个朋友的身高都不应超过 h。如果某人的身高大于 h,他可以弯下腰,这样他就不会被看守员注意到。第 i 个人的身高等于 ai。通常情况下,假设每个人行走的宽度为 1,而弯腰的人的宽度为 2。朋友们想要在行走时互相交谈,所以他们想要在一排行走。那么,使朋友们能够在一排行走而不被看守员注意到的道路的最小宽度是多少?

输入 输入的第一行包含两个整数 n 和 h(1 ≤ n ≤ 1000,1 ≤ h ≤ 1000)— 朋友的数量和栅栏的高度。

第二行包含 n 个整数 ai(1 ≤ ai ≤ 2h),其中第 i 个整数等于第 i 个人的身高。

输出 输出一个整数 — 最小可能的合法道路宽度

内容

为了使朋友们能够在一排行走而不被看守员注意到,我们需要找到一个最小的道路宽度。

首先,我们可以观察到,对于每个人来说,他们要么直立行走(宽度为 1),要么弯腰行走(宽度为 2)。那么,对于每个人来说,他们的行走宽度可以表示为 min(ai, 2h)。

接下来,我们需要确定整个队列的宽度。我们可以将每个人的行走宽度相加,即 sum(min(ai, 2h))。然而,行走宽度之间可能会有重叠,我们需要减去重叠的部分。

重叠部分发生在一个人的行走宽度超过了下一个人的行走宽度的情况下。我们只需要关注相邻两个人的行走宽度,如果前一个人的行走宽度大于后一个人的行走宽度,则存在重叠。

我们可以遍历每对相邻的人,如果重叠,则减去两者中较小的行走宽度,即 sum(min(ai, 2h)) - min(min(ai, 2h), min(ai+1, 2h))。

最后,所需的最小道路宽度为 sum(min(ai, 2h)) 减去所有重叠部分的总和。

下面是用代码表示解决方案的示例:

def minimum_width(n, h, heights):
    total_width = sum(min(height, 2 * h) for height in heights)
    overlap = sum(min(min(heights[i], 2 * h), min(heights[i+1], 2 * h)) for i in range(n-1) if heights[i] > heights[i+1])
    return total_width - overlap

n, h = map(int, input().split())
heights = list(map(int, input().split()))

answer = minimum_width(n, h, heights)
print(answer)

这个解决方案的时间复杂度为 O(n),其中 n 是朋友的数量。

最小合法道路宽度:朋友们沿着栅栏行走

原文地址: https://www.cveoy.top/t/topic/PjP 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录