求助各位神犇,爆搜把自己搜蒙了
查看原帖
求助各位神犇,爆搜把自己搜蒙了
1559398
WA_csp_noip楼主2024/11/10 11:33
#include <stdio.h>
#include <string.h>
#define min(a, b) a < b ? a : b
using namespace std;

const int N = 3e5 + 1;
int n, hack, c[N], ans = 1e9;
char t[N];

inline void calc() {
	bool b[N];
	memset(b, 0, sizeof(b));
	for (int j = 1; j <= n; j++) {
		if (c[j] == 1) {
			if (j - 1 >= 1 && !b[j - 1]) {
				c[j - 1] = 1;
				b[j - 1] = 1;
			}
			if (j + 1 <= n && !b[j + 1]) {
				c[j + 1] = 1;
				b[j + 1] = 1;
			}
		}
	}
}

inline void dfs(int i, int s) {
	if (i == n + 1) {
		for (int i = 1; i <= 20; i++) {
			calc();
			int sum = 0;
			for (int i = 1; i <= n; i++)
				sum += c[i];
			if (sum != hack)
				continue;
			char y[N];
			for (int i = 1; i <= n; i++)
				y[i] = c[i] + '0';
			if (y + 1 == t + 1) {
				ans = min(ans, s);
				return;
			}
		}
		return;
	}
	if (s < hack) {
		c[i] = 1;
		dfs(i + 1, s + 1);
	}
	c[i] = 0;
	dfs(i + 1, s);
}

int main() {
	scanf("%d", &n);
	scanf("%s", t + 1);
	for (int i = 1; i <= n; i++)
		hack += t[i] - '0';
	dfs(1, 0);
	printf("%d", ans);
}
2024/11/10 11:33
加载中...