码迷,mamicode.com
首页 > 其他好文 > 详细

洛谷 P1120 小木棍

时间:2016-06-26 10:22:08      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:

题目描述

乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过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 }

 



洛谷 P1120 小木棍

标签:

原文地址:http://www.cnblogs.com/Ateisti/p/5617421.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!