代码格式化 n, s, k = map(int, input().split()) d = list(map(int, input().split())) v = list(map(int, input().split())) nodes = sorted([(i, v[i]) for i in range(n)], key=lambda x: x[1], reverse=True) left_max = [(-1, -1)] * n # 从左向右扩展 right_max = [(-1, -1)] * n # 从右向左扩展 for i, _ in nodes: # 向左扩展 j = i while j >= 0 and d[i-j] <= k: if v[j] > left_max[i][1]: left_max[i] = (j, v[j]) j -= 1 # 向右扩展 j = i while j < n and d[j-i] <= k: if v[j] > right_max[i][1]: right_max[i] = (j, v[j]) j += 1 max_value = -1 max_shields = [] for i in range(s+1): shields = nodes[:i] value = sum([v[i] for i in range(n) if any([abs(i-j) <= k for j, _ in shields])]) if value > max_value: max_value = value max_shields = shields max_shields.sort() print(’ '.join([str(i) for i, _ in max_shields])) print(max_value)
时间: 2024-02-05 19:03:08 浏览: 65
需要注意的是,这段代码中的字符串 `'` 可能是中文输入法下的特殊字符,会导致程序出错。建议将其替换为 `'` 或 `"`。
具体来说,代码的实现过程如下:
1. 读入 n、s 和 k,以及两个列表 d 和 v,分别表示敌人距离和敌人的价值。
2. 将所有敌人按照价值从高到低排序,记录每个敌人向左和向右扩展 k 的范围内价值最高的敌人。
3. 枚举所有可能的护盾组合,计算每个组合下的总价值,找到最优组合以及对应的最大价值。
4. 输出最优组合以及对应的最大价值。
具体实现过程中,算法先将所有敌人按照价值从高到低排序:
```python
nodes = sorted([(i, v[i]) for i in range(n)], key=lambda x: x[1], reverse=True)
```
然后对每个敌人向左和向右分别扩展 k 的范围,记录每个范围内价值最高的敌人:
```python
left_max = [(-1, -1)] * n
right_max = [(-1, -1)] * n
for i, _ in nodes:
# 向左扩展
j = i
while j >= 0 and d[i-j] <= k:
if v[j] > left_max[i][1]:
left_max[i] = (j, v[j])
j -= 1
# 向右扩展
j = i
while j < n and d[j-i] <= k:
if v[j] > right_max[i][1]:
right_max[i] = (j, v[j])
j += 1
```
最后枚举所有可能的护盾组合,计算每个组合下的总价值,找到最优组合以及对应的最大价值:
```python
max_value = -1
max_shields = []
for i in range(s+1):
shields = nodes[:i]
value = sum([v[i] for i in range(n) if any([abs(i-j) <= k for j, _ in shields])])
if value > max_value:
max_value = value
max_shields = shields
max_shields.sort()
```
最后输出最优组合以及对应的最大价值:
```python
print(' '.join([str(i) for i, _ in max_shields]))
print(max_value)
```
阅读全文