萌新刚学oi1ms,TLE on #30所有剪枝都加了求调
  • 板块P1120 小木棍
  • 楼主Sine_Func
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/8/26 16:37
  • 上次更新2024/8/26 19:22:54
查看原帖
萌新刚学oi1ms,TLE on #30所有剪枝都加了求调
975724
Sine_Func楼主2024/8/26 16:37
#include <bits/stdc++.h>
//#define int long long
using namespace std;
inline bool cmp(int x, int y) {
	return x > y;
}
int n, a[70], vis[70], s, n1122334, factor;
inline bool dfs(int r, int l, int last) {
	if (!(r | l))return 1;
	if (!l)l = factor;
	for (register int i = (l == factor ? 1 : last + 1); i <= n; i++) {
		if (i > 0 && !vis[i - 1] && a[i - 1] == a[i])continue;
		if (!vis[i] && a[i] <= l) {
			vis[i] = 1;
			if (dfs(r - 1, l - a[i], i))return 1;
			else {
				vis[i] = 0;
				if (l == factor || l == a[i])return 0;
			}
		}
	}
	return 0;
}
inline void solve() {
	for (factor = a[1]; factor <= s / 2; factor++)
		if (!(s % factor)) {
			memset(vis, 0, sizeof(vis));
			if (dfs(n, factor, -1)) {
				cout << factor;
				return;
			}
		}
	cout << s;
}
signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n1122334;
	n = s = 0;
	for (register int i = 1; i <= n1122334; i++) {
		cin >> a[i];
		a[++n] = a[i];
		s += a[n];
	}
	sort(a + 1, a + 1 + n, cmp);
	solve();
	return 0;
}

https://www.luogu.com.cn/record/174833324

2024/8/26 16:37
加载中...