60pts求助,悬赏两个关注
查看原帖
60pts求助,悬赏两个关注
687698
_dijkstra_楼主2023/2/2 20:39

wa 60pts。

代码看起来很恶心,但是和题解打得差不多,如果能找到不同也可以!

#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;
}
2023/2/2 20:39
加载中...