洛谷 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 }
				
时间: 2024-10-09 08:15:09

洛谷 P1120 小木棍的相关文章

洛谷P1120 小木棍

洛谷1120 小木棍 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50.     现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度.     给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度. 输入输出格式 输入格式: 输入文件共有二行. 第一行为一个单独的整数N表示砍过以后的小木棍的总数,其中N≤60 (管理员注:要把超过50的长度自觉过滤掉,坑了很多人了!) 第二行为N个用空个隔开的正整数,表示N根小木棍的长度.

洛谷P1120小木棍[DFS]

题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度. 输入输出格式 输入格式: 输入文件共有二行. 第一行为一个单独的整数N表示砍过以后的小木棍的总数,其中N≤60 (管理员注:要把超过50的长度自觉过滤掉,坑了很多人了!) 第二行为N个用空个隔开的正整数,表示N根小木棍的长度. 输出格式: 输出文件仅一行,表示要求

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

二次联通门 : luogu P1120 小木棍 [数据加强版] /* luogu P1120 小木棍 [数据加强版] 暴搜 + 剪枝 枚举可能的长度 挨个检查答案 二分显然正确性不能保障 搜索时从最大的开始找 放上当前木棍后的长度比枚举的长度要大, 则退出 若当前的长度与当前扫到的木棍长度相同, 或是还需要的长度与枚举的长度相同,则退出 若当前的木棍不符合要求, 则后面与它长度相同的木棍都不行 */ #include <algorithm> #include <iostream>

【基础练习】【背包DP】洛谷1164 小A点菜题解

洛谷的题目又有那令人···的悲剧格式= = 洛谷1164 小A点菜 本题地址:http://www.luogu.org/problem/show?pid=1164 题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家--餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:"随便点". 题目描述 不过uim由于买了一些辅(e)辅(ro)书,口袋里只剩M元(M<=10000). 餐馆虽低端,但是菜品种类不少,有N种(N<=100),第i种

洛谷 3951 小凯的疑惑

洛谷 3951 小凯的疑惑 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的.现在小 凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在 小凯无法准确支付的商品. 输入输出格式 输入格式: 输入数据仅一行,包含两个正整数 aa 和 bb ,它们之间用一个空格隔开,表示小凯手 中金币的面值. 输出格式: 输出文件仅一行,一个正整数 NN ,表示不找零的情况下,小凯用手中

洛谷 P3951 小凯的疑惑

问题描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的.现在小凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在小凯无法准确支付的商品. 输入格式 输入文件名为math.in. 输入数据仅一行,包含两个正整数 a 和 b,它们之间用一个空格隔开,表示小凯手中金币的面值. 输出格式 输出文件名为math.out. 输出文件仅一行,一个正整数 N,表示不找零的情况下,小凯用手中的

P1120小木棍

题目传送P1120 有许多剪枝的搜索 先考虑答案的范围,先把小木棍排个序,原木棍的长一定大于等于最长的一根 然后,就枚举一下原木棍的长度,搜是否能按这个长度拼成所有的木棍,如果能拼成直接就是答案了 确定了原始长度,然后用总长度就能算出原始木棍的条数.如果不能整除的话,肯定不是答案 然后确定搜索的状态,当前拼到第几跟,这一根还剩多长,拼这一根用的上一根小木棍的编号 我们肯定要先拼大的,再用小的去补大的 如果我们用小的凑的话,那些大的很难凑齐 还有一个优化就是,有很多长度相同的小木棍,对于一种长度不

P1120 小木棍 [数据加强版]

题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度. 输入输出格式 输入格式: 输入文件共有二行. 第一行为一个单独的整数N表示砍过以后的小木棍的总数,其中N≤65 (管理员注:要把超过50的长度自觉过滤掉,坑了很多人了!) 第二行为N个用空个隔开的正整数,表示N根小木棍的长度. 输出格式: 输出文件仅一行,表示要求

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

原题链接 简要题意: 把若干 \(\leq 50\) 的小木棍拼成若干长度相同的长木棍(一个小木棍也可以作为一根长木棍).求可以拼成的长木棍的最小长度. 暴力出奇迹 一看数据范围,\(n \leq 65\). 这一看就是指数级复杂度 我还没见过什么 \(O(n^5)\) 的算法.. 首先考虑 \(\texttt{dfs}\),枚举长木棍的长度,然后用 \(\texttt{dfs}\) 进行暴力枚举当前的小木棍分给哪一组(可以算出组数的),验证即可. 对这种最 卑劣 不太行的搜索,下面开始大力剪枝