社区讨论

87pts求条,玄关

P1120[CERC 1995] 小木棍参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mkj63dxo
此快照首次捕获于
2026/01/18 11:19
上个月
此快照最后确认于
2026/01/21 18:15
4 周前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define getchar() getchar_unlocked()
#define putchar(c) putchar_unlocked(c)
template<typename T>
inline void read(T &x) {
	x = 0;
	char c = getchar();
	bool f = 0;
	while (c < '0' || c > '9') {
		if (c == '-') f = 1;
		c = getchar();
	}
	while (c >= '0' && c <= '9') {
		x = (x << 3) + (x << 1) + (c ^ 48);
		c = getchar();
	}
	if (f) x = -x;
}
template<typename T>
inline void write(T x) {
	if (x == 0) {
		putchar('0');
		return;
	}
	static char stk[40];
	int top = 0;
	if (x < 0) {
		putchar('-');
		x = -x;
	}
	while (x) {
		stk[top++] = x % 10 + '0';
		x /= 10;
	}
	while (top) putchar(stk[--top]);
}
const int MAXN = 70;
int n, sum, len, cnt;
int a[MAXN];
bool vis[MAXN];
inline void swap_int(int &a, int &b) {
	int t = a;
	a = b;
	b = t;
}
inline void quick_sort(int l, int r) {
	while (l < r) {
		int i = l, j = r;
		int pivot = a[(l + r) >> 1];
		while (i <= j) {
			while (a[i] > pivot) i++;
			while (a[j] < pivot) j--;
			if (i <= j) {
				swap_int(a[i], a[j]);
				i++;
				j--;
			}
		}
		if (j - l < r - i) {
			quick_sort(l, j);
			l = i;
		} else {
			quick_sort(i, r);
			r = j;
		}
	}
}
inline bool dfs(int start, int now, int left) {
	if (left == 0) return true;
	if (now == len) return dfs(0, 0, left - 1);
	int remain = len - now;
	if (remain < a[n - 1]) return false;
	int fail = 0;
	for (register int i = start; i < n; ++i) {
		if (vis[i] || now + a[i] > len || a[i] == fail) continue;
		vis[i] = 1;
		if (dfs(i + 1, now + a[i], left)) return true;
		vis[i] = 0;
		fail = a[i];
		if (now == 0) return false;
		if (now + a[i] == len) return false;
		if (remain == a[i]) return false;
	}
	return false;
}
inline bool check(int l) {
	if (sum % l != 0) return false;
	len = l;
	cnt = sum / l;
	if (cnt > n) return false;
	for (int i = 0; i < n; i++) vis[i] = 0;
	return dfs(0, 0, cnt);
}
int main() {
	read(n);
	sum = 0;
	for (register int i = 0; i < n; ++i) {
		read(a[i]);
		sum += a[i];
	}
	if (n == 1) {
		write(sum);
		return 0;
	}
	quick_sort(0, n - 1);
	int maxl = sum >> 1;
	for (register int l = a[0]; l <= maxl; ++l) {
		if (sum % l != 0) continue;
		if (check(l)) {
			write(l);
			return 0;
		}
	}
	write(sum);
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...