码蹄杯 黑白双煞 题型:环题(模拟) 难度:钻石

131 阅读1分钟

码题集OJ-黑白双煞 (matiji.net)

image.png

样例输入:

9
HTHTHTHHT

样例输出:

2

思想

对于环题来说,我们可以将长度扩展1倍,模拟环。

首先,我们先统计一下没扩展之前黑点的长度。然后再拓展为环,这个时候再去统计环中每一段区间黑点的个数。我们需要找出一间黑点个数最多的区间,这个时候我们就需要输出白点的个数。白点的个数=黑点总数-区间黑点个数最大值。

code

#include <bits/stdc++.h>
#define endl "\n"
using namespace std;
const int N = 1e5 + 10, M = 2e5 + 10;
int  a[M];
int s[M];
string c;

int main() {
	int n, black = 0, ans = 0;

	cin >> n;
	cin >> c;


	for (int i = 0; i < n; i++) {
		if (c[i] == 'H') {
			a[i] = a[i + n] = 1;
			black++;
		}
	}

	s[0] = a[0];
	for (int i = 1; i < n * 2; i++) {
		s[i] = s[i - 1] + a[i];
	}


	for (int i = 0; i < n; i++) {
		if (ans < (s[i + black] - s[i])) {
			ans = s[i + black] - s[i];
		}
	}

	printf("%d\n", black - ans);
	return 0;
}

image.png