78pts求救
  • 板块P1120 小木棍
  • 楼主_XSOI_
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/4/13 22:13
  • 上次更新2024/4/14 09:08:42
查看原帖
78pts求救
1161545
_XSOI_楼主2024/4/13 22:13
#include <iostream>
#include <cmath>
#include <algorithm>
#define int long long
using namespace std;
const int MAXX = 1e3 + 11;
int a[MAXX];
bool vis[MAXX];
int flag;
int n, sum, ans;
void dfs(int step, int x, int k) { // step:长度 x:想要的长度 K:第几根
	if (flag) {
		return ;
	}
	if (x == 0) {
		if (step == sum / ans) { // 凑够了
			flag = 1;
			return ;
		}
		for (int i = 1; i <= n; i ++) {
			if (!vis[i]) { // 从第一个没用的木棍开始
				dfs(step + 1, ans, i);
				break;
			}
		}
	}
	if (k > n) {
		return ;
	}
	for (int i = k; i <= n; i ++) { // 从后面的开始
		if (!vis[i] and a[i] <= x) { // 可以用且比需要的长度短
			vis[i] = 1;
			dfs(step, x - a[i], i + 1);
			vis[i] = 0;
			if (ans == x) {
				break;
			}
			while (i < n and a[i] == a[i + 1]) {
				i ++;
			}
		}
	}
	return ;
}
signed main() {
	cin >> n;
	for (int i = 1; i <= n; i ++) {
		cin >> a[i];
		if (a[i] > 50) {
			a[i] = 0;// 防毒瘤
		}
		sum += a[i];
	}
	sort (a + 1, a + 1 + n, greater<int>());
	while (a[n] == 0) {
		n --;
	}
	for (int i = a[1]; i <= sum; i ++) {
		if (sum % i == 0) {
			ans = i;
			dfs(1, i, 1);
			if (flag) {
				cout << ans;
				return 0;
			}
		}
	}
	return 0;
}

剩下全 T,还差啥剪枝啊,想不出来了,玄 2 关

2024/4/13 22:13
加载中...