CE???
查看原帖
CE???
209691
Red_Alert_star楼主2023/8/18 23:07
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define ull unsigned long long
using namespace std;
int n,a[65],next[65],sum,vis[65],flag,m,cnt;
inline int read(){
    int x=0,f=1; char ch;
    ch=getchar(); while(ch<'0'||ch>'9'){
    	if(ch=='-') f=-1;
    	ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=x*10+ch-48;
		ch=getchar();
	}
	return x*f;
}
bool cmp(int x,int y)
{
	return x>y;
}
void dfs(int now,int last,int sx)
{
	int i;
	if(!sx)
	{
		if(now==m){
			flag=1;
			return;
		}
		for(i=1;i<=cnt;i++) if(!vis[i]) break;
		vis[i]=1;
		dfs(now+1,i,sum/m-a[i]);
		vis[i]=0;
		if(flag==1) return;
	}
	int l=last+1,r=cnt,mid;
	while(l<r)
	{
		mid=l+r>>1;
		if(a[mid]<=sx) r=mid;
		else l=mid+1;
	}
	for(int i=l;i<=cnt;i++)
	{
		if(!vis[i])
		{
			vis[i]=1;
			dfs(now,i,sx-a[i]);
			vis[i]=0;
			if(flag) return ;
			if(sx==a[i]||sx==sum/m) return ;
			i=next[i];
			if(i==cnt) return;
		}
	}
}
int main()
{
	n=read();
	for(int i=1,x;i<=n;i++)
	{
		x=read();
		if(x>50) continue;
		a[++cnt]=x;
		sum+=x;
	}
	sort(a+1,a+cnt+1,cmp);
	next[cnt]=cnt;
	for(int i=cnt-1;i>=1;i--)
	{
		if(a[i]==a[i+1]) next[i]=next[i+1];
		else next[i]=i;
	}
	for(int i=a[1];i<=sum/2;i++)
	{
		if(sum%i) continue;
		m=sum/i;
		flag=0;
		vis[1]=1;
		dfs(1,1,i-a[1]);
		vis[1]=0;
		if(flag){
			printf("%d",i);
			return 0;
		}
	}
	printf("%d",sum);
    return 0;
}

2023/8/18 23:07
加载中...