这题难度很唬人呀!!!

题目描述

乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过 505050。

现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度。

给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度。

输入格式

第一行是一个整数 nnn,表示小木棍的个数。
第二行有 nnn 个整数,表示各个木棍的长度 aia_iai​。

输出格式

输出一行一个整数表示答案。

样例 #1

样例输入 #1

9
5 2 1 5 2 1 5 2 1

样例输出 #1

6

提示

对于全部测试点,1≤n≤651 \leq n \leq 651≤n≤65,1≤ai≤501 \leq a_i \leq 501≤ai​≤50。

解析

先算出小木棍总长度。再枚举木棒长度。最后再搜索判断是否能成功。
本题需要极多(四五个)剪枝。具体剪枝见代码内部。

AC代码

/*优化1:从所有小木棍最长的长度枚举优化2:答案必须是所有小木棍总长度的约数优化3:拼每个木棒,保证后面的小木棍不大于前面的小木棍 优化4:等效冗余,某一个长度小木棍拼接失败 优化5:如果摸一个木棒,第一根拼接失败了返回上一层
*/
#include <iostream>
#include <cstdio>
#include <algorithm>using namespace std;int n, x, cnt, l, sum, len, tot;
int a[70];
int vis[70];bool cmp(int x, int y) {return x > y;
}bool dfs(int step, int val, int last) {if (step == tot + 1) {return 1;} if (val == len) {return dfs(step + 1, 0, step);}int fail = 0;for (int i = last + 1; i <= cnt; i++) {if (vis[i] == 1 || fail == a[i] || val + a[i] > len) {continue;}vis[i] = 1;if (dfs(step, val + a[i], i) == 1) {return 1;}fail = a[i];vis[i] = 0;if (val == 0 || val + a[i] == len) {return 0;} }return ; //防直接复制代码
}int main() {cin >> n;for (int i = 1; i <= n; i++) {cin >> x;if (x <= 50) {a[++cnt] = x;l = max(l, x);sum += x;}}sort(a + 1, a + cnt + 1, cmp);for (len = l; ; len++) {if (sum % len != 0) {continue;}tot = sum / len;if (dfs(1, 0, 0) == 1) {cout << len << endl;break;}}return 0;
}

P1120 小木棍题解相关推荐

  1. 洛谷 P1120 小木棍 题解

    这就是一道明显的爆搜题(人家洛谷也说了,,,),只是需要几个小小的优化,接下来为大家介绍一下: 1.将木棍先排个序(用处后面会讲),记住 长度>50 的要去掉 2.因为每一根的长度都不大于50, ...

  2. C++小木棍题解代码(备用)

    C++小木棍题解代码(备用) #include<iostream> #include<cstdio> #include<cstring> #include<a ...

  3. 洛谷[P1120 小木棍]

    洛谷[P1120 小木棍] 题目: 思路: 枚举小木棒可能的长度,从数组最大值开始枚举,这个值能被总长度整除才是可行的 在使用dfs枚举小木棒的每一种可能,如果不可能就找下一个可能的长度开始枚举 注意 ...

  4. 洛谷P1120小木棍

    肝了一天的题了,求过 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过 5050. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度 ...

  5. 题解 P1120 【小木棍 [数据加强版]】

    题面 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度,编程帮 ...

  6. 题解 Sticks 小木棍

    题解 Sticks 小木棍 题目描述: 每组数据给出N根小木棍,把它们拼接成若干根长度相等的木棍,求该长度的最小值. 题解: 该题就是dfs深搜+剪枝 ```cpp #include<iostr ...

  7. 小木棍(洛谷-P1120)

    题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过5050. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度 ...

  8. AC日记——小木棍【数据加强版】 洛谷 P1120

    题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度,编 ...

  9. 洛谷 小木棍(暴力+剪剪剪剪枝)

    题目链接: 小木棍 - 洛谷 思路: 如果只考虑暴力,做法很简单,枚举所有可能的最终长度,都跑一遍dfs,取最小结果即可,本题难就难在大量的剪枝,具体见代码. 我的思路也是参考了大佬的博客:题解 P1 ...

最新文章

  1. python 乒乓球_python乒乓球
  2. 通过WebAssembly在浏览器运行PHP
  3. 鸿蒙开发者自学,【5月21日鸿蒙公开课】自学鸿蒙 当代大学生的进阶之路
  4. SAP批次管理由物料级别转换到工厂级别的方法
  5. AQS理解之四—看看我们写的和 ReentrantLock 的公平不公平锁的区别
  6. pcb只开窗不镀锡_案例图解射频PCB设计要点
  7. oracle 手动链库,Oracle 数据库干数据库链(Database links)的两个例子
  8. 软件工程网络15个人阅读作业2(201521123111 陈伟泽)
  9. mariadb配置主从同步遇到的问题
  10. C3P0连接池配置和实现详解
  11. android mtklog,Mtklog结构及分析
  12. 动画效果--漫天飞雪
  13. 为魅族助攻,联发科发布Helio P25处理器
  14. win10修改DNS
  15. 无线信号的接收流程和接收机中基本结构的具体功能
  16. 计算机考研专业课科目834,2018考研华中科技大学834计算机专业基础综合考试大纲...
  17. 热修复系列之一----Android 热修复原理篇及几大方案比较
  18. mesh和wifi中继的区别_Mesh路由和无线中继的差距在哪里?谁才是更好的选择?
  19. 1159 Palindrome
  20. Aarch64过程调用标准

热门文章

  1. Chicken Soup 【阻碍你成长的最大敌人竟然是它-无意识】
  2. 常用超低阻值采样电阻阻值一览表
  3. 码云图床失效解决方案
  4. ICMP类型报文分类。
  5. android 震动的实现,android实现震动和声音
  6. 端口隔离的原理与配置
  7. 如何用java创建一个文件
  8. 蚂蚁集团三项技术方案入选“2021年信息技术应用创新典型解决方案”
  9. 工业机器人的控制算法
  10. 山河盟:人类为大地母亲准备的一份礼物