某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。 输入导弹依次飞来的高度,计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。写代码,时间复杂度O(nlongn)
时间: 2023-06-13 21:02:58 浏览: 773
这个问题可以使用 LIS(最长上升子序列)算法来解决。因为每一发导弹的高度都不能高于前一发,所以我们可以将导弹的高度看作序列,找到这个序列的最长上升子序列,就可以找到最多能拦截多少导弹。
同时,我们可以使用二分查找来优化LIS算法,将时间复杂度降到O(nlogn)。
下面是代码实现:
```python
def LIS(nums):
dp = []
for num in nums:
if not dp or num > dp[-1]:
dp.append(num)
else:
left, right = 0, len(dp) - 1
while left < right:
mid = (left + right) // 2
if dp[mid] < num:
left = mid + 1
else:
right = mid
dp[left] = num
return len(dp)
heights = list(map(int, input().split()))
print(LIS(heights))
```
对于最少需要配备多少套这种导弹拦截系统的问题,我们只需要将输入的导弹高度反转,再使用LIS算法求解即可。
```python
heights = list(map(int, input().split()))
print(LIS(heights)) # 最多能拦截多少导弹
print(LIS(heights[::-1])) # 最少需要配备多少套导弹拦截系统
```
阅读全文