其实就是求-1左边和右边的最小值,然后累加起来即为答案。
O(n)
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
cin>>n;
vector<int>vec(2, INT_MAX);
int x;
int index = 0;
for(int i = 0; i < n; i++){
cin>>x;
if(x == -1) {
index++;
}else {
vec[index] = min(vec[index], x);
}
}
cout<<vec[0] + vec[1];
return 0;
}
python代码
n = int(input())
a = list(map(int, input().split()))
lmin = 0
pos = 0
for i in range(n):
if a[i] == -1:
pos = i
break
print(min(a[:pos]) + min(a[pos+1:]))
Java代码
import java.util.*;
class Main {
public static void main(String[]args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n];
for (int i = 0 ; i < n ; i++) a[i] = sc.nextInt();
for (int i = 0 ; i < n ; i++) {
if (a[i] == -1) {
int p1 = i-1, p2 = i+1;
int min1 = Integer.MAX_VALUE, min2 = Integer.MAX_VALUE;
while (p1 >= 0) {
min1 = Math.min(min1, a[p1--]);
}
while (p2 < n) {
min2 = Math.min(min2, a[p2++]);
}
System.out.println(min1 + min2);
return;
}
}
}
}
现在有一个警察抓小偷的游戏,小红刚好玩到让小偷跑到了一个长长的桥面上去。
假设在桥面上,有N块紧密相连的桥板。标号1~N,小偷已经逃到了标号为K的桥板上。现在, 小红可以用超能力拆除一些桥板来使得小偷掉落河中,然而他无法拆除小偷所踩的桥板K。每个桥板拆除时都需要支付不同的代价Ai,当桥体两侧的桥板都没有与河两岸连接时,则桥和小偷会一起掉落到河中。
求小红需要支付的最小代价。
假设某一情况如图:
| 8 | 小偷 | 7 | 3 | 6 |
|---|
桥体1和桥体4可以通过分别支付8和3的代价来拆除,此时小偷所在的桥板2和桥板3一起掉落河中。因此最小代价为11.
第一行给出N, 表示冰块的数量。 第二行中,按顺序给出代表打破第i块冰块所需的力的Ai。 题目保证企鹅所在的地方用−1表示, 没有企鹅位于冰块1或冰块N的情况。 3≤N≤2∗105,1≤Ai≤109
输出可以将企鹅击落到水中的最小力。
输入
5
8 -1 7 3 6
输出
11
说明
见题目举例
输入
10
49 46 -1 55 54 53 52 51 50 51
输出
96
说明 打破桥面2和桥面9, 最小代价为46+50=96