94pts求助
  • 板块P1120 小木棍
  • 楼主FirstBd
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/6/5 15:02
  • 上次更新2023/10/23 13:54:53
查看原帖
94pts求助
714094
FirstBd楼主2023/6/5 15:02
#include<bits/stdc++.h>
using namespace std;
int id[65];
vector<int> vec;
int n,ans=-0x3f3f3f,len;
int gs,sum;
int cnt;
bool vis[65];
bool f;
struct cmp{
	bool operator () (const int &a,const int &b){
		return a>b;
	}
};
void dfs(int,int,int);
int main()
{
	cin>>n;
	vec.push_back(0x3f3f3f);
	for(int i=1;i<=n;i++){
		int tmp;
		cin>>tmp;
		ans=max(ans,tmp);
		sum+=tmp;
		vec.push_back(tmp);
	}
	sort(vec.begin(),vec.end(),cmp());
	cnt=vec.size()-1;
	id[cnt]=cnt;
	for(int i=cnt;i>=1;i--){
		if(vec[i]==vec[i-1]){
			id[i-1]=id[i];
		}
		else{
			id[i-1]=i-1;
		}
	}
	for(int i=ans;i<=sum/2;i++){
		if(sum%i==0){
			f=0;
			len=i;
			vis[1]=1;
			gs=sum/i;
			dfs(1,1,len-vec[1]);
			vis[1]=0;
			if(f){
				cout<<i;
				return 0;
			}
		}
	}
	cout<<sum;
	return 0;
}
void dfs(int k,int last,int rest){
	int i;
	if(!rest){
		if(k==gs) {f=1;return;}
		for(i=1;i<=cnt;i++){
			if(!vis[i]){
				vis[i]=1;
				break;
			}
		}
		dfs(k+1,i,len-vec[i]);
		vis[i]=0;
		if(f){
			return;
		}
	}
	for(i=last+1;i<=cnt;i++){
		if(vec[i]<=rest&&!vis[i]){
			break;
		}
	}
	for(;i<=cnt;i++){
		if(!vis[i]){
			vis[i]=1;
			dfs(k,i,rest-vec[i]);
			vis[i]=0;
			if(f||rest==vec[i]){
				return;
			}
		}
		i=id[i];
	}
}

第19和22点过不了 求助qwq

2023/6/5 15:02
加载中...