60pts WA#22+TLE其他 (球dalao来调
查看原帖
60pts WA#22+TLE其他 (球dalao来调
674793
luoguhandongheng楼主2023/7/26 22:31

rt rp++ 蒟蒻感激不尽

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,a[70],flag,book[70];
multiset <int,greater<int> > s;
inline bool cmp(int x,int y){
	return x>y;
}
inline void print(multiset<int,greater<int> > s){
	for(auto i:s)
		cout<<i<<' ';
	cout<<endl;
}
inline void dfs(int k,multiset<int,greater<int> > s){
//	print(s);
	if(s.empty()){
		flag=1;
		return;
	}	
	if(flag)
		return;
	auto pos=lower_bound(++s.begin(),s.end(),k-(*s.begin()),greater<int>());
	if(pos==s.end())
		return;
	for(auto i=pos;i!=s.end();i=s.equal_range(*i).second){
		multiset<int,greater<int> > t(s.begin(),s.end());
		auto p=t.find(*i);
		int last=*i;
		int sum=(*i)+(*t.begin());
	//	cout<<*i<<' '<<*p<<endl;
		t.erase(p);
		t.erase(t.begin());
		t.insert(sum);//	print(t);
		while(t.find(k)!=t.end())
			t.erase(k);
		dfs(k,t);
		if(flag)
			return;
		if(*t.begin()==k-*t.begin() || *t.begin()==k)
			return;
	}

}
signed main(){
	ios::sync_with_stdio(false);
	cin>>n;
	int sum=0,maxa=-999999999;
	for(int i=1;i<=n;++i){
		cin>>a[i];
		maxa=max(maxa,a[i]); 
		s.insert(a[i]);
		sum+=a[i];
	}
	vector <int> tmp;
	for(int i=1;i<=sqrt(sum);++i){
		if(sum%i==0){
			tmp.push_back(i);
			tmp.push_back(sum/i);
		}
	}
	sort(tmp.begin(),tmp.end());
	for(int i=0;i<tmp.size();++i){
		if(tmp[i]<maxa)	continue;
		flag=0;
	//	cout<<tmp[i]<<endl;
		dfs(tmp[i],s);
		if(flag==1){
			cout<<tmp[i];
			return 0;
		} 
	}
	return 0;
}

多说两句,这个代码完全是蒟蒻大腿一拍想出来的用STL multiset 模拟合并过程 感觉该剪枝的地方都剪了 球球dalao能来指点一下我这个方法可不可行 ORZ!

2023/7/26 22:31
加载中...