代码看起来很恶心,但是和题解打得差不多,如果能找到不同也可以!
#include <iostream>
#include <cstdio>
using namespace std;
int min(int a, int b, int c) {return min(min(a, b), c);}
const int N = 1e6 + 5, T = 1, inf = 0x3f3f3f3f;
int dp[2][3];
int main()
{
int n, a;
scanf("%d%d", &n, &a);
dp[1][-1 + T] = dp[1][0 + T] = dp[1][1 + T] = inf, dp[1][a + T] = 0;
for (int i = 2; i <= n; i++)
{
scanf("%d", &a);
if (a == -1)
dp[i & 1][-1 + T] = dp[i & 1 ^ 1][-1 + T],
dp[i & 1][0 + T] = inf,
dp[i & 1][1 + T] = dp[i & 1 ^ 1][1 + T] + 2;
else if (a == 0)
dp[i & 1][-1 + T] = dp[i & 1 ^ 1][-1 + T] + 1,
dp[i & 1][0 + T] = min(dp[i & 1 ^ 1][-1 + T], dp[i & 1 ^ 1][0 + T]),
dp[i & 1][1 + T] = dp[i & 1 ^ 1][1 + T] + 1;
else if (a == 1)
dp[i & 1][-1 + T] = dp[i & 1 ^ 1][-1 + T] + 2,
dp[i & 1][0 + T] = dp[i & 1 ^ 1][0 + T] + 1,
dp[i & 1][1 + T] = min(dp[i & 1 ^ 1][-1 + T], dp[i & 1 ^ 1][0 + T], dp[i & 1 ^ 1][1 + T]);
}
int ans = min(dp[n & 1][-1 + T], dp[n & 1][0 + T], dp[n & 1][1 + T]);
if (ans >= inf) puts("BRAK"); else cout << ans;
return 0;
}