P1120 小木棍

暴搜+剪枝,Σ了

#include<bits/stdc++.h>
using namespace std;
int n,m,a[70],nt[70],cnt,ans,len;
bool used[70],ready;
bool cmp(int a,int b){
	return a>b;
}
void dfs(int k,int last,int rest){
	int i;
	if(!rest){
		if(k==m){
			ready=1;
			return;
		}
		for(int i=1;i<=cnt;i++)
			if(!used[i])break;
		used[i]=1;
		dfs(k+1,i,len-a[i]);
		used[i]=0;
		if(ready)return;
	}
	int l=last+1, r=cnt, mid;
	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(!used[i]){
			used[i]=1;
			dfs(k,i,rest-a[i]);
			used[i]=0;
			if(ready)return;
			if(rest==a[i]||rest==len)return;
			i=nt[i];
			if(i==cnt)return;
		}
	}
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	int d;
	for(int i=1;i<=n;i++){
		cin>>d;
		if(d>50)continue;
		a[++cnt]=d;
		ans+=d;
	}
	sort(a+1,a+cnt+1,cmp);
	nt[cnt]=cnt;
	for(int i=cnt-1;i>0;i--){
		if(a[i]==a[i+1])nt[i]=nt[i+1];
		else nt[i]=i;
	}
	for(len=a[1];len<=ans/2;len++){
		if(ans%len!=0)continue;
		m=ans/len;
		ready=0;
		used[1]=1;
		dfs(1,1,len-a[1]);
		used[1]=0;
		if(ready){
			cout<<len;
			return 0;
		}
	}
	cout<<ans;
	return 0;
}
posted @ 2025-03-20 19:14  yzc_is_SadBee  阅读(50)  评论(0)    收藏  举报