30pts求优化
  • 板块P1120 小木棍
  • 楼主TLE_AK
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/2/26 17:01
  • 上次更新2023/10/23 23:40:45
查看原帖
30pts求优化
788951
TLE_AK楼主2023/2/26 17:01
#include<bits/stdc++.h>
using namespace std;

namespace acac
{
	int A[110];
	int L[110];
	int v[110];
	bool f;
	int ans=0,n;
	bool cmp(int x,int y)
	{
		return x>y;
	}
	void dfs(int k,int m)
	{
		if(f)return ;
		if(k==n+1)
		{
			for(int i=1;i<=m;i++)
			{
				if(L[i]!=ans)return;
			}
			f=1;
			return ;
		}
		int cnt=0;
		for(int i=1;i<=m;i++)
		{
			if(L[i]!=ans)cnt++;
			
			//if(ans==40)cout<<L[i]+A[n]<<" "<<ans<<" "<<(L[i]!=ans)<<endl;
		}
		if(cnt>n-k+1)return ;
        for(int i=1;i<=m;i++)
		{
			
			if(L[i]!=ans&&L[i]+A[n]>ans)return ;
			//if(ans==40)cout<<L[i]+A[n]<<" "<<ans<<" "<<(L[i]!=ans)<<endl;
		}
		for(int i=1;i<=m;i++)
		{
			if(L[i]+A[k]>ans)continue;
			
			L[i]+=A[k];
			
			dfs(k+1,m);
			L[i]-=A[k];
		}
		for(int i=1;i<=m;i++)
		{
			
			if(L[i]!=ans&&L[i]+A[n]>ans)return ;
			//if(ans==40)cout<<L[i]+A[n]<<" "<<ans<<" "<<(L[i]!=ans)<<endl;
		}
		L[m+1]=A[k];
		dfs(k+1,m+1);
		L[m+1]=0;
		return ;
	}
	int main()
	{
		
		cin>>n;
		int h=0; 
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&A[i]);
			ans=max(ans,A[i]);//优化2
			h+=A[i];
		}	
		sort(A+1,A+n+1,cmp);//优化1
		
		while(1)
		{
			ans++;
			f=0;
			memset(L,0,sizeof(L));
			dfs(1,0);
			//cout<<ans<<endl;
			if(f)break;
		}
		cout<<ans;
		return 0;
	}
}

int main()
{

	acac::main();
	return 0;
}
2023/2/26 17:01
加载中...