【玄关】51pts 求优化
  • 板块P1120 小木棍
  • 楼主_H17_
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/8/6 14:29
  • 上次更新2024/8/6 15:20:12
查看原帖
【玄关】51pts 求优化
743014
_H17_楼主2024/8/6 14:29
#include<bits/stdc++.h>
#define ALL(x) x.begin(),x.end() 
using namespace std;
int n,cnt[51],sum,minval=0x3f3f3f3f,maxval;
vector<int>vec;
bool dfs(int left,int curleft,int ans,int last){
    if(!left)
        return!(curleft^ans);
    for(int i=min(maxval,curleft),t;i>=max(minval,last+1);i--){
        if(cnt[i]){
            cnt[i]--;
            t=dfs(left-1,(curleft^i)?curleft-i:ans,ans,(curleft^i)?0:i);
            if(t)
            	return 1;
            cnt[i]++;
        }
    }
    return 0;
}
int main(){
    ios::sync_with_stdio(0);
    cin>>n;
    for(int i=1,j;i<=n;i++){
        cin>>j;
        cnt[j]++,sum+=j,minval=min(minval,j),maxval=max(maxval,j);
    }
    for(int i=maxval;i*i<=sum;i++){
        if(sum%i)
            continue;
        vec.push_back(i);
    }
    for(int i=1;i*i<sum;i++){
        if(sum%i)
            continue;
        vec.push_back(sum/i);
    }
    sort(ALL(vec));
    vec.pop_back();
    for(auto p:vec)
    	if(dfs(n,p,p,minval-1)){
        	cout<<p;
        	return 0;
		}
	cout<<sum;
    return 0;
}
2024/8/6 14:29
加载中...