题目描述
牛牛发明了一款破冰行动的游戏,假设在河面上,有n
块紧密相连的冰块。标号1-n
。将一只企鹅放到任意一个标号为k
的冰块上,现在通过打破一些冰块来使得企鹅掉落河中,然而他无法打破企鹅所踩的冰块k
。每个冰块都有不同的强度Ai
,所以需要一个等于Ai
的力来打破冰。当两侧的冰块都没有与河两岸连接时,则冰块会掉落到河中。
输入描述
第一行给出n
,表示冰块的数量。
第二行中,按顺序给出代表打破第i
块冰块所需的力的Ai
。题目保证企鹅所在的地方用-1
表示,没有企鹅位于冰块1
或冰块n
的情况。
3<=n<=2*10^5
输出描述
输出可以击落企鹅到水中的最小力。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
// 找到企鹅的位置
int k = -1;
for (int i = 0; i < n; ++i) {
if (a[i] == -1) {
k = i;
break;
}
}
// 计算从左边到每个冰块的最小力
vector<int> left(n, 0);
for (int i = 1; i < n; ++i) {
if (a[i] != -1) {
left[i] = min(left[i - 1] + a[i], a[i]);
}
}
// 计算从右边到每个冰块的最小力
vector<int> right(n, 0);
for (int i = n - 2; i >= 0; --i) {
if (a[i] != -1) {
right[i] = min(right[i + 1] + a[i], a[i]);
}
}
// 计算最小力
int min_force = INT_MAX;
for (int i = 0; i < n; ++i) {
if (i < k) {
min_force = min(min_force, left[i]);
} else if (i > k) {
min_force = min(min_force, right[i]);
}
}
cout << min_force << endl;
return 0;
}