Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
0ms 暴搜+剪枝+O2优化#include <cstdio> #include <cstdlib> #include <algorithm> #pragma GCC optimize(2) //O2优化 using namespace std; inline int read() { int x=0,f=1;char c=getchar(); while (c<'0' || c>'9'){if (c=='-')f=-1;c=getchar();} while (c>='0'&&c<='9'){x=x*10+c-48;c=getchar();} return x*f; } const int MAXN=105; int n,m,sum,len; bool flag; int stick[MAXN],next[MAXN]; bool used[MAXN]; bool cmp(int a,int b) { return a>b; } inline void make_next() { next[n]=n; for (int i=n-1;i>=1;i--) { if (stick[i]==stick[i+1])next[i]=next[i+1]; else next[i]=i; } } inline int find(int l,int r,int x) { int mid; while (l<r) { mid=(l+r)>>1; if (stick[mid]<=x)r=mid; else l=mid+1; } return l; } inline void dfs(int now,int rest,int last) { if (rest==0) { if (now==1) { flag=true; return ; } int x=0; for (int i=1;i<=n;i++) if (!used[x=i])break; used[x]=true; dfs(now-1,len-stick[x],x); used[x]=false; if (flag)return ; } int l=find(last+1,n,rest); for (int i=l;i<=n;i++) { if (!used[i]) { used[i]=true; dfs(now,rest-stick[i],i); used[i]=false; if (flag)return ; if (stick[i]==rest || len==rest)return ; i=next[i]; if (i==n) return; } } } int main() { while (true) { n=read(); if (n==0)break; sum=0;flag=0; for (int i=1;i<=n;i++) { stick[i]=read(); sum+=stick[i]; } sort (stick+1,stick+n+1,cmp); make_next(); for (int i=stick[1];i<=sum/2;i++) { if (sum%i==0) { len=i; used[1]=true; dfs(sum/i,i-stick[1],0); used[1]=false; if (flag) { printf("%d\n",len); goto end; } } } printf("%d\n",sum); end:continue; } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator