30分,玄关求调
  • 板块P1120 小木棍
  • 楼主l0_0l
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/7/28 19:28
  • 上次更新2025/7/29 00:04:10
查看原帖
30分,玄关求调
1147579
l0_0l楼主2025/7/28 19:28
#include<bits/stdc++.h>
using namespace std;
int n, a[70], sum, maxx = INT_MIN, cnt;
bool b[70];
bool cmp(int a, int b) {
	return a > b;
}
int main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; ++i) {
		scanf("%d", a + i);
		sum += a[i];
		maxx = max(a[i], maxx);
	}
	sort(a + 1, a + 1 + n, cmp);
	for (int i = maxx; i <= sum; ++i) {//木棍长度
		if (sum % i != 0) {//如果是总长度的约数就尝试(可行性剪枝)
			continue;
		}
		int flag = 0, Flag = 0;
		memset(b, 0, sizeof b);//重置标记
		for (int j = 1; j <= n; ++j) {//从第一个小木棒尝试
			flag = 0;
			if (b[j] != 0) {//如果此木棒之前用过就跳过这个木棒
				continue;
			}
			for (int k = j; k <= n; ++k) {//开始找能和搜索的木棒组成大木棒的木棒
				if (b[k] == 0) {//要找的木棒没和其他木棒搭配过
					cnt += a[k];
					if (cnt > i) {
						cnt -= a[k];
					} else {
						if (cnt == i) {
							b[k] = 1;
							break;
						} else {
							b[k] = 1;
							if (k == n) {
								flag = 1;   //如果找到最后一个还是没有组成大木棒,就说明大木棒长度不可行
							}
						}
					}
				}
			}
			if (flag == 1) {
				Flag = 1;
				break;
			}
		}
		if (Flag == 0) {
			printf("%d", i);
			return 0;
		}
	}
}
2025/7/28 19:28
加载中...