社区讨论

TLE最后一个点求条

P1120[CERC 1995] 小木棍参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mjtwns5v
此快照首次捕获于
2025/12/31 19:00
2 个月前
此快照最后确认于
2026/01/03 09:35
2 个月前
查看原帖
CPP
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int MAXN=65+5;
int l,r,mid,n,ans,sum,len;
int a[MAXN];
bool vis[101];
inline bool dfs(int ii,int now,int rr){
	if(!rr) return true;
	if(now==len) return dfs(1,0,rr-1);
	if(now<len){
		int i=ii;
		while(i<=n&&(vis[i]||now+a[i]>len)) i++;
		if(i>n) return false;
	}
	int fail=0;
	for(int i=ii;i<=n;i++){
		if(!vis[i]&&now+a[i]<=len&&a[i]!=fail){
			vis[i]=true;
			if(dfs(i+1,now+a[i],rr)) return true;
			vis[i]=false;
			fail=a[i];
			if(!now) break;
			if(now+a[i]==len) break;
			if(len-now==a[i]) break;
		}
	}
	return false;
}
inline bool check(int x){
	if(sum%x)return false;
	len=x;
	memset(vis,0,sizeof vis);
	return dfs(1,0,sum/x);
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		sum+=a[i];
	}
	sort(a+1,a+n+1,greater<int>());
	l=a[1];
	for(len=l;len<=sum;len++){
		if(sum%len==0&&check(len)){
			cout<<len;
			return 0;
		}
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...