声明:学习了题解第一条!
问题:所以不用快读就会TLE最后四个点吗,有其它优化吗
#include<bits/stdc++.h>
using namespace std;
const int N = 70;
int n,m,d,a[N],nxt[N],cnt,sum,len;
bool used[N],ok;
bool cmp(int a,int b){
return a > b;
}
void dfs(int k,int lst,int rst){
if(!rst){
int i;
if(k == m){
ok = true;
return;
}
for(i = 1; i <= cnt; i++)
if(!used[i])
break;
used[i] = true;
dfs(k+1,i,len - a[i]);
used[i] = false;
if(ok)
return;
}
int lft = lst;
int rgt = cnt;
int mid,tmp;
while(lft <= rgt){
mid = (lft + rgt) >> 1;
if(a[mid] <= rst)
tmp = mid,
rgt = mid-1;
else
lft = mid+1;
}
for(int i = tmp; i <= cnt; i++){
if(!used[i]){
used[i] = true;
dfs(k,i,rst - a[i]);
used[i] = false;
if(ok)
return;
if(rst == a[i] || rst == len)
return;
i = nxt[i];
if(i == cnt)
return;
}
}
}
int main(){
scanf("%d",&n);
for(int i = 1; i <= n; i++){
scanf("%d",&d);
if(d > 50)
continue;
a[++cnt] = d;
sum += d;
}
sort(a+1,a+cnt+1,cmp);
nxt[cnt] = cnt;
for(int i = cnt-1; i >= 1; i--){
if(a[i] == a[i+1])
nxt[i] = nxt[i+1];
else
nxt[i] = i;
}
for(len = a[1]; len <= sum >> 1; len++){
if(sum % len != 0)
continue;
m = sum / len;
ok = false;
used[1] = true;
dfs(1,1,len - a[1]);
used[1] = false;
if(ok){
printf("%d\n",len);
exit(0);
}
}
printf("%d\n",sum);
return 0;
}