请用c++代码实现在一个山峰中住着许多部落,其中一些部落住在山脚,一些部落住在山腰,一些 部落住在山顶。我们假设共有 n 个部落,编号分别为 1,2,3, . . . , n − 1, n ,且第 pos 个部落的位置在山顶。那么编号为 1 ∼ pos 的部落海拔依次上升,从 pos ∼ n 的部落海拔依次降低。第 i 个部落和第 i + 1, i − 1个部落相邻 (2 ≤ i ≤ n − 1)。 由于山中常年缺水,主要的水资源是山间的流水,具体来说,水资源都聚集在山 顶,海拔较低的部落只能使用海拔较高的部落用剩下的水资源。由于分配不均, 相邻的部落之间可能会发生战争,其中第 i 个部落的战斗力为 ai。 当某一个部落的海拔比另一个相邻部落的海拔低,且战斗力比这个部落高,则会 对这个部落发动战争。 现在为了避免相邻部落之间发生战争,你可以修改一些部落的战斗力,使得每一 对相邻的部落之间都不会有战争。请问最少可以修改几个部落的战斗力才可以满 足要求? 输入格式 输入第一行包含两个正整数 n, pos(1 ≤ n, pos ≤ 10^5),分别表示部落的数量以 及住在山顶的部落的编号。 输入第二行包含 n 个正整数 ai (1 ≤ ai ≤ 10^9),分别表示每个部落的战斗力。 输出格式 输出一行一个正整数表示答案。
时间: 2024-03-03 14:49:20 浏览: 166
Yolov7目标检测与实例分割的C++推理代码
5星 · 资源好评率100%
以下是使用 C++ 实现的代码:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n, pos;
cin >> n >> pos;
vector<int> a(n);
for (int i = 0; i < n; i++)
cin >> a[i];
sort(a.begin(), a.end());
int ans = 0;
int left = pos - 1, right = pos - 1;
while (left >= 0 && right < n)
{
if (a[right] <= a[left])
{
ans += a[left] - a[right];
right++;
}
else
{
ans += a[right] - a[left];
left--;
}
}
if (left >= 0)
ans += a[left];
else if (right < n)
ans += a[n - 1] - a[right];
cout << ans << endl;
return 0;
}
```
算法思路:
- 将每个部落的战斗力按从小到大的顺序排列。
- 从山顶开始,向左和向右遍历每个部落,比较相邻两个部落的战斗力大小。
- 如果左边的部落的战斗力不小于右边的部落的战斗力,则将右边的部落的战斗力提高到左边的部落的战斗力加一,即修改右边的部落的战斗力,使得相邻两个部落的战斗力相同。
- 如果右边的部落的战斗力不小于左边的部落的战斗力,则将左边的部落的战斗力降低到右边的部落的战斗力减一,即修改左边的部落的战斗力,使得相邻两个部落的战斗力相同。
- 如果左边或右边的部落已经没有相邻的部落,则将剩下的部落的战斗力修改为与相邻的部落的战斗力相同。
- 最后,计算修改部落数量的总和并输出。
阅读全文