hdu 1455 sticks
来源:互联网 发布:淘宝怎么找货到付款 编辑:程序博客网 时间:2024/05/20 00:52
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1455
题目大意是给你一堆木棍,然后让他们互相之间随意拼接,组成任意多个相同长度的 新木棍,要求新木棍们的长度最短
一道dfs,但是似乎要剪枝,我一开始也没有想到好的方法= =
最后网上看了题解以后跟着做的...
stick数组表示当前木棍的长度,然后used数组表示已经用来拼接过的木棍
#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <string>using namespace std;int flag;int n;int len,num;int stick[100],used[100];bool cmp(int a,int b){ return a>b;}void dfs(int pos,int cur,int cnt){ if(flag) return ; if(cur==len) { cnt++; if(cnt==num) { flag=1; return ; } dfs(0,0,cnt); return; } if(pos==n) return; //已搜索整个数组 int pre=-1; for(int i=pos;i<n;i++) { //第i根stick没有用过;之前没有与他等长的stick失效,现有长度加上sticks[i]不大于理论长度 if(!used[i]&&pre!=stick[i]&&cur+stick[i]<=len) { pre=stick[i]; used[i]=1; dfs(i+1,cur+stick[i],cnt); used[i]=0; if(flag)//满足条件,返回 return ; //最长的一根stick[i]要被废弃,则表示至少有一根最长的要被废弃,不合适 if(pos==0) return; } }}int main(){ //freopen("in.txt","r",stdin); int sum; while(scanf("%d",&n)!=EOF) { if(n==0) break; sum=0; for(int i=0;i<n;i++) { scanf("%d",&stick[i]); sum+=stick[i]; } sort(stick,stick+n,cmp); int max=stick[0]; for(len=max;len<=sum;len++) { if(len>(sum+1)/2) { len=sum; break; } if(sum%len==0) { num=sum/len; memset(used,0,sizeof used); flag=0; dfs(0,0,0); if(flag) break; } } printf("%d\n",len); } return 0;}
0 0
- HDU 1455 Sticks
- Hdu 1455 Sticks
- hdu 1455 Sticks
- HDU 1455 Sticks
- hdu 1455 Sticks
- hdu 1455 Sticks
- HDU 1455 Sticks
- 【DFS】hdu 1455 Sticks
- Sticks hdu 1455
- hdu 1455 sticks
- HDU 1455 Sticks
- HDU 1455 Sticks
- HDU 1455 Sticks
- HDU 1455 Sticks
- day3 HDU 1455 Sticks
- hdu 1455 Sticks
- HDU 1455 Sticks
- hdu 1455 hdu 1455 Sticks
- HDU 1875 畅通工程再续
- PHP归档phar性能测试
- Capital in the Twenty-First Century 21世纪资本论
- POI与JXL自动列宽设置的方法
- Linux下安装Oracle11g
- hdu 1455 sticks
- moodle安装体验
- 深入理解JavaScript系列(20):你真懂JavaScript吗?
- Java String.split()用法
- SOURCEFORGE会不会因为GITHUB死掉?
- Windows服务创建及安装
- 深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP
- Windows下进程通信的几种方式
- 剖析 Qt 中一些常用类中文说明