记录编号 |
306848 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[POJ 1011] 木棍拼接 |
最终得分 |
100 |
用户昵称 |
Rapiz |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.018 s |
提交时间 |
2016-09-13 13:17:10 |
内存使用 |
0.29 MiB |
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<functional>
using namespace std;
const int MAXN=70;
int n,a[MAXN],sum,tar,tcnt;
bool pkd[MAXN];
inline bool dfs(int now,int len,int cnt){
if(cnt==tcnt) return true;
if(len+sum-cnt*tar<tar) return false;
int last=0;
for(int i=now+1;i<=n;i++) if(!pkd[i]&&a[i]+len<=tar&&a[last]!=a[i]){
bool f=0;
pkd[i]=1;
if(a[i]+len==tar) {
f=dfs(0,0,cnt+1);
}
else f=dfs(i,len+a[i],cnt);
pkd[i]=0;
//f=f||dfs(i,len,cnt);
if(f) return true;
if(a[i]+len==tar||len==0) break;
last=i;
}
return false;
}
int main(){
freopen("sticka.in","r",stdin);
freopen("sticka.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%d",&a[i]);
if(a[i]>50) {i--,n--;continue;}
sum+=a[i];
}
sort(a+1,a+1+n,greater<int>());
int i;
for(i=a[1];i<=sum;i++)
if(!(sum%i)) {
tar=i,tcnt=sum/tar;
if(dfs(0,0,0)) {
printf("%d ",i);
return 0;
}
}
}