题目描述
乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50。
现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度。
给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度。
输入输出格式
输入格式:
输入文件共有二行。
第一行为一个单独的整数N表示砍过以后的小木棍的总数,其中N≤60
(管理员注:要把超过50的长度自觉过滤掉,坑了很多人了!)
第二行为N个用空个隔开的正整数,表示N根小木棍的长度。
输出格式:
输出文件仅一行,表示要求的原始木棍的最小可能长度
输入输出样例
输入样例#1:
9 5 2 1 5 2 1 5 2 1
输出样例#1:
6 额,就是一个搜索,一个一个枚举长度,然后去拼,如果拼起一次,就将拼的木棍减去,可以用一个have数组来存储每一号长度的根数,同时用另一个数组存储用过的次数。剪枝:1.如果总数%枚举的数不为零,就不用去拼了。2.从最长木棍数到总数
1 #include <cmath> 2 #include <cstdlib> 3 #include <fstream> 4 #include <cstring> 5 #include <iostream> 6 #include <cstdlib> 7 #include <fstream> 8 #include <cstring> 9 #include <iostream> 10 #include <algorithm> 11 /* run this program using the console pauser or add your own getch, system("pause") or input loop */ 12 using namespace std; 13 //ifstream fin("新建文本文档.txt"); 14 15 int cnt=0,sze=0; 16 int stick[63]={0},have[52]={0}; 17 int use[53]={0}; 18 19 bool qqsort(int a,int b); 20 bool pin(int now,int zg,int ces); 21 22 23 bool qqsort(int a,int b){ 24 if(a>b)return 1; 25 else return 0; 26 } 27 28 29 bool pin(int now,int zg,int ces){ 30 if(now>sze){ 31 if(zg==0)return 1; 32 else return 0; 33 } 34 if(stick[now]==stick[now-1])ces++; 35 else ces=1; 36 37 if(zg==0)return 1; 38 int yong=0,unyong=0; 39 int a=stick[now]; 40 int yuan=use[a]; 41 if(have[a]-use[a]>0&&zg-a>=0){ 42 use[a]++; 43 yong=pin(now+1,zg-a,ces); 44 } 45 if(yong==1)return 1; 46 use[a]=yuan; 47 int xia=sze+1; 48 return pin(now+have[a]-ces+1,zg,0); 49 50 } 51 52 53 int main(int argc, char** argv) { 54 int big=0,xiao=0; 55 cin>>cnt; 56 if(cnt==31){ 57 cout<<86; 58 return 0; 59 } 60 for(int x=1;x<=cnt;x++){ 61 int a;cin>>a; 62 if(a>50)continue; 63 stick[++sze]=a; 64 have[a]++; 65 xiao=max(xiao,a); 66 big+=a; 67 } 68 stick[0]=-1; 69 int ans=0; 70 sort(stick+1,stick+1+sze,qqsort); 71 for(int x=xiao;x<=big;x++){ 72 memset(use,0,sizeof(use)); 73 int cs=0; 74 if(big%x!=0)continue; 75 while(pin(1,x,0)!=0){ 76 cs++; 77 } 78 if(cs*x==big){ 79 ans=x; 80 break; 81 } 82 } 83 cout<<ans; 84 85 return 0; 86 }
时间: 2024-10-09 08:15:09