求助
  • 板块P1120 小木棍
  • 楼主crzcqh
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/1/21 16:45
  • 上次更新2024/1/21 19:56:12
查看原帖
求助
769006
crzcqh楼主2024/1/21 16:45
#include<bits/stdc++.h>
using namespace std;
int n,sum,m,l,r,mid,len;
int a[70],vis[70],fp[70]; 
inline int read(){
	int ans=0;
	char c=getchar();
	for(;!isdigit(c);c=getchar()) ;
	for(;isdigit(c);c=getchar()) ans=(ans<<3)+(ans<<1)+c-48;
	return ans;
}
bool cmp(int a,int b){
	return a>b;
} 
bool dfs(int k,int last,int now){
	if(!now){
		if(k==m) return true;
		int p;
		for(int i=1;i<=n;i++)
			if(!vis[i]){
				p=i; break;
			}
		vis[p]=1; 
		bool f=dfs(k+1,p,len-a[p]);
		vis[p]=0;
		if(f) return true;
	}
	l=1,r=n;
	//从大到小 
	while(l<r){
		mid=l+r>>1;
		if(a[mid]<=now) r=mid;
		else l=mid+1;
	}
	for(int i=l;i<=n;i++){
		if(!vis[i]){
			vis[i]=1;
			bool f=dfs(k,i,now-a[i]);
			vis[i]=0;
			if(f) return true;
			if(now==a[i]||now==len) return false;
			i=fp[i];
			if(i==n) return false;
		}
	} 
	return false;
	
}
int main(){
	n=read(); 
	for(int i=1;i<=n;i++) a[i]=read(),sum+=a[i];
	sort(a+1,a+1+n);
	fp[n]=n;
	for(int i=n-1;i>=1;i--){
		if(a[i]==a[i+1]) fp[i]=fp[i+1];
		else fp[i]=i;
	}
	for(len=a[1];len<=sum;len++){
		if(sum%len==0){
			m=sum/len;
			vis[1]=1;
			if(dfs(1,1,len-a[1])){
				printf("%d",len); return 0;
			}
			vis[1]=0;
		}		
	}
	printf("%d",sum);
	return 0;
}

2024/1/21 16:45
加载中...