TLE 一片,但是已经和第一篇题解差不多了,求调。
查看原帖
TLE 一片,但是已经和第一篇题解差不多了,求调。
510555
ImposterAnYu楼主2021/12/14 19:12
#include<bits/stdc++.h>
using namespace std;
int n,i,a[70],m,len,sum,w;
bool b[70],f,go[70];
bool cmp(int x,int y){
	return x > y;
}
void dfs(int k,int l,int r){
	if(k == m){
		cout<< i << endl;
		exit(0);
	}
	int i,j;
	if(!r){
		for(i = 1; i <= n; i++){
			if(!b[i]){
				b[i] = 1;
				dfs(k + 1,i,len - a[i]);
				b[i] = 0;
				return ;
			}
		}
	}
	for(i = l + 1; i <= n; i++){
		if(!b[i] && r >= a[i]){
			b[i] = 1;
			dfs(k,i,r - a[i]);
			b[i] = 0;
			if(r == a[i] || r == len){
				return ;
			}
			i = go[i];
		}
	}
	return ;
}
inline int read(){
    int x = 0,f = 1;
    char ch = getchar();
    while(!isdigit(ch)){
        if(ch == '-'){
            f = -1;
        }
        ch = getchar();
    }
    while(isdigit(ch)){
        x = (x << 1) + (x << 3) + ch - '0';
        ch = getchar();
    }
    return x * f;
}
int main(){
	n = read();
	for(i = 1; i <= n; i++){
		a[i] = read();
		sum += a[i];
	}
	sort(a + 1,a + n + 1,cmp);
	w = n;
	go[n] = n;
	for(i = n - 1; i >= 1; i--){
		if(a[i] == a[w]){
			go[i] = w;
		}else{
			go[i] = i;
			w = i;
		}
	}
	for(i = a[1]; i <= sum / 2; i++){
		if(sum % i == 0){
			b[1] = 1;
			len = i;
			m = sum / i;
			dfs(1,1,len - a[1]);
			b[1] = 0;
		}
	}
	cout<< sum << endl;
	return 0;
}
2021/12/14 19:12
加载中...