27TLE,蒟蒻求助
  • 板块P1120 小木棍
  • 楼主NightTide
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/8/1 21:48
  • 上次更新2023/11/4 12:16:48
查看原帖
27TLE,蒟蒻求助
547908
NightTide楼主2021/8/1 21:48
#include<bits/stdc++.h>
using namespace std;
int n;
bool flag,vis[70];
int stick[70],nxt[70];
int cnt,sum,len,num;
inline int read(){
    int x=0; bool f=1; char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
    for(; isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';
    if(f) return x;
    return 0-x;
}
inline bool cmp(int a,int b){
	return a>b;
}
inline void dfs(int k,int last,int rest){
	if(rest==0){
		if(k==num){
			flag=true;
			return ;
		}
		int nex;
		for(register int i=0;i<cnt;i++){
			if(!vis[i]){
				nex=i;
				break;
			}
		}
		vis[nex]=true;
		dfs(k+1,nex,len-stick[nex]);
		vis[nex]=false;
		if(flag){
			return ;
		}
	}
    int l=last+1,r=cnt,mid;
    while(l<r){
        mid=(l+r)>>1;
        if(stick[mid]<=rest)
			r=mid;
        else
			l=mid+1;
    }
    for(register int i=0;i<cnt;i++){
    	if(!vis[i]){
    		vis[i]=true;
    		dfs(k,i,rest-stick[i]);
    		vis[i]=false;
    		if(flag) return ;
    		if(rest==stick[i]||rest==len) return;
    		i=nxt[i];
    		if(i==cnt) return ;
		}
	}
}
int main(){
	n=read();
	for(register int i=0;i<n;i++){
		stick[cnt]=read();
		if(stick[cnt]<=50){
			sum+=stick[cnt];
			cnt++;
		}
	}
	sort(stick,stick+cnt,cmp);
    nxt[cnt]=cnt;
    for(register int i=cnt-1;i>0;i--){
        if(stick[i]==stick[i+1]) nxt[i]=nxt[i+1];
        else nxt[i]=i;
    }
    for(len=stick[0];len<=(sum/2);len++){
    	if(sum%len) continue;
    	num=sum/len;
    	vis[1]=true;
    	flag=false;
    	dfs(1,1,len-stick[1]);
    	vis[1]=false;
    	if(flag){
    		cout<<len<<endl;
    		return 0;
		}
	}
	cout<<sum<<endl;
	return 0;
}

实在优化不动了,蒟蒻求助

2021/8/1 21:48
加载中...