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!