POJ-1011 sticks 棍棒拼接
2015-08-22 21:48
429 查看
题意:给出N根长短不一的木棍,求拼出M根长度相同的长棍,M尽量大。
解法:N小于64,搜索+剪枝
剪枝出发点 : 尽可能减少冗余枚举 注定失败的结局直接返回false
解法:N小于64,搜索+剪枝
剪枝出发点 : 尽可能减少冗余枚举 注定失败的结局直接返回false
#include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #include<iostream> #include<stdlib.h> #include<set> #include<map> #include<queue> #include<vector> #include<bitset> #pragma comment(linker, "/STACK:1024000000,1024000000") template <class T> bool scanff(T &ret){ //Faster Input char c; int sgn; T bit=0.1; if(c=getchar(),c==EOF) return 0; while(c!='-'&&c!='.'&&(c<'0'||c>'9')) c=getchar(); sgn=(c=='-')?-1:1; ret=(c=='-')?0:(c-'0'); while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0'); if(c==' '||c=='\n'){ ret*=sgn; return 1; } while(c=getchar(),c>='0'&&c<='9') ret+=(c-'0')*bit,bit/=10; ret*=sgn; return 1; } #define inf 1073741823 #define llinf 4611686018427387903LL #define PI acos(-1.0) #define lth (th<<1) #define rth (th<<1|1) #define rep(i,a,b) for(int i=a;i<=b;i++) #define drep(i,a,b) for(int i=a;i>=b;i--) #define gson(i,root) for(int i=ptx[root];~i;i=ed[i].next) #define tdata int testnum;scanff(testnum);for(int cas=1;cas<=testnum;cas++) #define mem(x,val,n) memset(x,val,(n+2)*sizeof(x[0])) #define mkp(a,b) make_pair(a,b) #define findx(x) lower_bound(b+1,b+1+bn,x)-b #define pb(x) push_back(x) using namespace std; typedef long long ll; typedef pair<int,int> pii; int a[1111],n,len,tot,lnum; bool cmp(int x,int y){return x>y;} bool vis[1111]; int last; bool dfs(int r,int need){ if(r==0&&need==0)return true; if(need==0)need=len; rep(i,(need==len)?1:last+1,n){//优化起始位置,直接从上一根接下去匹配 if(i>1&&a[i]==a[i-1]&&vis[i-1]==false)continue; //如果这个位置这个长度的棍子已经匹配失败过,跳过这个棍子 if(!vis[i]&&a[i]<=need){ vis[i]=true;last=i; if(dfs(r-1,need-a[i]))return true; else{ vis[i]=false; if(a[i]==need||need==len)return false; //如果第一根或者最后一根匹配失败,说明已经不可能[只要这个剪枝就能AC] } } } return false; } main(){ while(scanf("%d",&n)!=EOF){ if(n==0)break; int sum=0; rep(i,1,n){ scanff(a[i]); sum+=a[i]; } sort(a+1,a+1+n,cmp); mem(vis,0,n); rep(i,1,sum){ if(sum%i==0){ len=i; lnum=sum/i; if(dfs(n,len)){ printf("%d\n",i); break; } } } } }
相关文章推荐
- HDU 5419 细节处理
- 非归档模式下利用冷备恢复数据库
- 基于递归神经网络的人脸识别探究
- 第七章 Hyper-V 2012 R2 授权管理
- Tomcat8源码编译及导入Eclipse中研究
- 欢迎使用CSDN-markdown编辑器
- 封装RabbitMQ.NET Library 的一点经验总结
- securet crt不能配置了
- 001-NSString的常用功能
- POJ 2263 Heavy Cargo (SPFA+Dijkstra,最短路变形)
- hdu5417(BC)
- POJ 2263 Heavy Cargo (SPFA+Dijkstra,最短路变形)
- Codeforce 515 B . Drazil and His Happy Friends
- MySQL必知必会(使用子查询)
- Java 源码学习线路————_先JDK工具包集合_再core包,也就是String、StringBuffer等_Java IO类库
- 编写高质量代码改善C#程序的157个建议——建议118:使用SecureString保存密钥等机密字符串
- O2O外卖玩众包 开放平台难解标准之痛
- 线程和进程
- 【英语】Bingo口语笔记(54) - how to date a foreigner
- [转]树莓派gpio口控制