社区讨论
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 条回复,欢迎继续交流。
正在加载回复...