#30TLE求调 悬关
  • 板块P1120 小木棍
  • 楼主ZBXAMZL
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/3/25 20:31
  • 上次更新2024/3/25 20:50:01
查看原帖
#30TLE求调 悬关
1047605
ZBXAMZL楼主2024/3/25 20:31
#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
int n,a[70],cnt,sum,x,mx,b[3333],vis[70];
void dfs(int k,int s,int S,int las){
	if(k==sum/S+1){
		printf("%d",S);
		exit(0);
	}
	for(int i=las+1;i<=n;i++){
		if(s+a[i]>S)continue;
		if(vis[i])continue;
		vis[i]=1;
		if(s+a[i]==S)dfs(k+1,0,S,0);
		else dfs(k,s+a[i],S,i);
		vis[i]=0;
		if(s+a[i]==S)return;
		if(s==0)return;
		while(a[i]==a[i+1]&&i<n)i++;
	}
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&x);
		if(x>50)continue;
		a[++cnt]=x;
		sum+=x;
		mx=max(mx,x);
	}
	n=cnt;
	cnt=0;
	sort(a+1,a+n+1,greater<int>());
	if(mx==1){
		cout<<1<<endl;
		return 0;
	}
	for(int i=2;i*i<=sum;i++)
		if(sum%i==0){
			if(i>=mx)b[++cnt]=i;
			if(i==sum/i)break;
			b[++cnt]=sum/i;
		}
	sort(b+1,b+cnt+1);
	for(int i=1;i<=cnt;i++)
		dfs(1,0,b[i],0);
	printf("%d",sum);
	return 0;
}
2024/3/25 20:31
加载中...