蒟蒻求助
  • 板块P1120 小木棍
  • 楼主_stOrz_
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/10/7 09:44
  • 上次更新2023/11/4 04:29:38
查看原帖
蒟蒻求助
236416
_stOrz_楼主2021/10/7 09:44
#include<bits/stdc++.h>
using namespace std;
int x, cnt, n, cur, sum = 0, len, l, r, mid, a[100005], Next[100005];
bool flag = false, vis[100005];
bool cmp(int x, int y){
	return x > y;
}
bool check(int now, int last, int rest){
	if(rest == 0){
		if(now == len){
			return true;
		}
		for(int i = 1; i <= cnt; i++){
			if(vis[i] == false){
				vis[i] = true;
				flag = check(now + 1, i, cur - a[i]);
				vis[i] = false;
				return flag;
			}
		}
	}
	l = last + 1, r = cnt;
	while(l < r){
		mid = (l + r) >> 1;
		if(a[mid] <= rest) r = mid;
		else l = mid + 1;
	}
	for(int i = l; i <= cnt; i++){
		if(vis[i] == true) continue;
		vis[i] = true;
		flag = check(now, i, rest - a[i]);
		vis[i] = false;
		if(flag == true) return flag;
		if(rest == a[i] or rest == cur) return false;
		if(Next[i] == cnt) return false;
	}
}
int main() 
{
	cin >> n;
	for(int i = 1; i <= n; i++){
		cin >> x;
		if(x <= 50) {
			a[++cnt] = x;
			sum += x;
		}
	}	
	sort(a + 1, a + cnt + 1,  cmp);
	Next[cnt] = cnt;
	for(int i = cnt - 1; i > 0; i--){
		if(a[i] == a[i + 1]) Next[i] = Next[i + 1];
		else Next[i] = i;
	}
	cur = a[1];
	for(;cur <= sum / 2; cur++){
		if(sum % cur == 0){
			len = sum / cur;
			vis[1] = true;
			if(check(1, 1, cur - a[1]) == true){
				break;
			}
			vis[1] = false;
		}
		cur++;
	}
	cout << sum << "\n";
} 

大红大紫加一个绿

2021/10/7 09:44
加载中...