洛谷 P1120 小木棍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P1120 小木棍相关的知识,希望对你有一定的参考价值。

题目描述

乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过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 小木棍的主要内容,如果未能解决你的问题,请参考以下文章

洛谷P1120 小木棍

P1120 小木棍 [数据加强版]

P1120小木棍

P1120 小木棍 [数据加强版] 题解

题解 P1120 小木棍 [数据加强版]

luogu P1120 小木棍 [数据加强版]