TLE求调
  • 板块P1120 小木棍
  • 楼主Cary1075
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/8 13:13
  • 上次更新2024/8/8 13:20:22
查看原帖
TLE求调
946090
Cary1075楼主2024/8/8 13:13
#include<iostream>
#include<algorithm>
using namespace std;
bool vis[70],ok;
int n,m,a[70],nex[70],num,cnt=1,sum=0,len;
bool cmp(int a,int b){
	return a>b;
}
void dfs(int k,int last,int rest){
	int i;
	if(!rest){
		if(k==m){
			ok=1;
			return;
		}
		for(i=1;i<=cnt;i++){
			if(!vis[i]) break;
		}
		vis[i]=1;
		dfs(k+1,i,len-a[i]); 
		vis[i]=0;
		if(ok){
			return;
		}
	}
	int l=last+1,r=cnt,mid;
	while(l<r){ 
		mid=(l+r)>>1;
		if(a[mid]<=rest){
			r=mid;
		}
		else{
			l=mid+1;
		}
	}
	for(i=l;i<=cnt;i++){
		if(!vis[i]){
			vis[i]=1;
			dfs(k,i,rest-a[i]);
			vis[i]=0;
			if(ok){
				return;
			}
			if(rest==a[i] || rest==len){
				return;
			}
			i=nex[i];
			if(i==cnt){
				return;
			}
		}
	}
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&num);
		if(num>50){
			continue;
		}
		a[cnt]=num;
		cnt++;
		sum+=num;
	}
	sort(a+1,a+cnt+1,cmp);
	nex[cnt]=cnt;
	for(int i=cnt-1;i>=1;i--){
		if(a[i]==a[i+1]){
			nex[i]=nex[i+1];
		}
		else{
			nex[i]=i;
		}
	}
	for(len=a[1];len<=sum/2;len++){
		if(sum%len!=0){
			continue;
		}
		m=sum/len;
		vis[1]=1;
		dfs(1,1,len-a[1]);
		vis[1]=0;
		if(ok){
			cout<<len<<endl;
			return 0;
		}
	}
	cout<<sum<<endl;
	return 0;
} 
2024/8/8 13:13
加载中...