如题,我机会用完了,麻烦还有机会的提供一下 #21 的数据
提交这个代码
/*
Luogu P1120 小木棍
https://www.luogu.com.cn/problem/P1120
*/
#include "iostream"
#include "algorithm"
using namespace std;
int a[70], nxt[70], n, m, high, temp, c;
bool vis[70];
void dfs(int x, int target, int pre, int cnt){
int i;
if(x==target){
cnt++;
if(cnt==m-1){
cout << target;
exit(0);
}
else{
for(i=1;i<=cnt;i++) if(!vis[i]) break;
vis[i]=1;
dfs(a[i], target, i, cnt);
vis[i]=0;
}
}
int l=pre+1, r=c, mid, y=target-x;
while(l<r){
mid=(l+r)>>1;
if(a[mid]<=y) r=mid;
else l=mid+1;
}
for(i=l;i<=c;i++){
if(vis[i]) continue;
vis[i]=true;
if(x+a[i]<=target) dfs(x+a[i], target, i, cnt);
vis[i]=false;
if(y==a[i] || y==target) return;
i=nxt[i];
if(i==c) return;
}
}
bool cmp(int i1, int i2){
return i1>i2;
}
int main(){
cin >> n;
for(int i=1;i<=n;i++){
cin >> temp;
if(temp<=50) a[++c]=temp;
high+=temp;
}
sort(a+1, a+1+c, cmp);
nxt[c]=c;
for(int i=c-1;i>=1;i--){
if(a[i]==a[i+1]) nxt[i]=nxt[i+1];
else nxt[i]=i;
}
for(int i=a[1];i<=high/2;i++){
if(a[c]<=i && !(high%i)){
m=high/i;
vis[1]=true;
dfs(a[1], i, 1, 0);
vis[1]=false;
}
}
cout << high;
}