87分最后一个点270ms求调
查看原帖
87分最后一个点270ms求调
755759
zhujiangyuan楼主2023/7/31 20:30

scanf,c++98加上o2,桶排序

#include<bits/stdc++.h>
using namespace std;
int n,a[70],b[70],cnt,maxx=-1,m;
bool flag=false,vis[70];
void dfs(int sum,int len,int now)
{
	if(flag) return ;
	if(len==m)
	{
		if(sum==n)
		{
			flag=true;
			return ;
		}
		else len=0,now=1;
	}
	if(len==0)
	{
		int k=1;
		while(vis[k]) k++;
		vis[k]=1;//选 
		dfs(sum+1,len+a[k],k+1);
		vis[k]=0;//不选 
		return ;
	}
	for(int i=now;i<=n;++i)
	{
		if(vis[i]==0&&len+a[i]<=m)
		{
			if(a[i]==a[i-1]&&!vis[i-1]) continue;
			vis[i]=1;
			dfs(sum+1,len+a[i],i+1);
			if(flag) return ;
			vis[i]=0;
			if(len+a[i]==m) break;
		}
	}
}
int main()
{
//    freopen("input.in","r",stdin);
//    freopen("output.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		cnt+=a[i],maxx=max(a[i],maxx);
		b[a[i]]++;
	}
	for(int i=maxx,j=0;j<n;i--)
	{
		while(b[i]) a[++j]=i,b[i]--;
	}
	for(int i=maxx;i<=cnt;i++)
	{
		if(cnt%i==0)
		{
			memset(vis,0,sizeof(vis));
			m=i;
			dfs(0,0,1);
			if(flag) printf("%d",i),exit(0);
		}
	}
    return 0;
}
2023/7/31 20:30
加载中...