【题目描述】

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

【输入】

第一行为一个单独的整数N表示砍过以后的小木棍的总数,其中N≤60,第二行为N个用空个隔开的正整数,表示N根小木棍的长度。

【输出】

仅一行,表示要求的原始木棍的最小可能长度。

【输入样例】

9
5 2 1 5 2 1 5 2 1

【输出样例】

6

【源程序】

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<bitset>
#define EPS 1e-9
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define LL long long
const int MOD = 1E9+7;
const int N = 1000+5;
const int dx[] = {-1,1,0,0,-1,-1,1,1};
const int dy[] = {0,0,-1,1,-1,1,-1,1};
using namespace std;
int a[N];
bool vis[N];
int cnt;
bool cmp(int x,int y){return x>y;
}
bool dfs(int k,int step,int rest,int len){//k为已经拼接好的个数,step为上一个的编号,rest为剩余的长度,len为木棍的长度if(k==cnt+1 && rest==0)//拼接好个数为要求数且无剩余return true;else if(k==cnt+1)//拼接好个数为要求数但有剩余return false;else if(rest==0){//拼接好个数不为要求数但无剩余,重新开始rest=len;//剩余数变为长度step=0;//编号归零}for(int i=step+1;i<=cnt;i++){if(!vis[i]){if(rest-a[i]>=0){//保证剩余值不为负数vis[i]=true;if(dfs(k+1,i,rest-a[i],len))return true;vis[i]=false;if(a[i]==rest || len==rest)//头尾剪枝,此时已在回溯之后,需要判断头尾两种情况break;while(a[i]==a[i+1])//去重剪枝,用当前长度搜索无结果时,对同样长度的可以忽略i++;}}}return 0;
}
int main(){int n;scanf("%d",&n);int sum=0;for(int i=1;i<=n;i++){int x;scanf("%d",&x);if(x<=50){a[++cnt]=x;sum+=x;}}sort(a+1,a+1+cnt,cmp);for(int i=a[1];i<=sum;i++){if(sum%i==0){if(dfs(1,0,i,i)){printf("%d\n",i);break;}}}return 0;
}

小木棍(信息学奥赛一本通-T1442)相关推荐

  1. 信息学奥赛一本通(基础算法与数据结构-题解汇总目录)

    信息学奥赛一本通(C++版)在线评测系统 基础(二)基础算法   更新中...... 第一章高精度计算 1307[例1.3]高精度乘法 1308[例1.5]高精除 1309[例1.6]回文数(Noip ...

  2. 信息学奥赛一本通 (C++)上机练习

    信息学奥赛一本通(C++)上机练习 此书为娃儿的第一本刷题书.娃儿现在四年级 ,希望他能坚持下来.特开贴加油 luogu: disangan223 第一部分 C++语言 第一章 C++语言入门 T10 ...

  3. 信息学奥赛一本通 2021:【例4.6】最大公约数

    [题目链接] ybt 2021:[例4.6]最大公约数 [题目考点] 1. while循环 2. 求最大公约数 辗转相减法 辗转相除法 [解题思路] 解法1:枚举 取较小数字,从该数字的值开始从大到小 ...

  4. 信息学奥赛一本通在线提交地址

    信息学奥赛一本通 1 C++语言入门 1.1 综合 1.1.1 P1458 地球人口承载力估计 正确: 770 提交: 1794 比率: 42.92 % 1.1.2 P1686 Hello, Worl ...

  5. 信息学奥赛一本通1267:【例9.11】01背包问题(二维dp与滚动数组优化)

    [题目描述] 一个旅行者有一个最多能装 MM 公斤的背包,现在有 nn 件物品,它们的重量分别是W1,W2,...,WnW1,W2,...,Wn,它们的价值分别为C1,C2,...,CnC1,C2,. ...

  6. 信息学奥赛一本通——2068:【例2.6】鸡兔同笼

    大家好(๑╹◡╹)ノ" 这里是小蒟蒻 一天没更新了呢! 今天给大家带来<信息学奥赛一本通--2068:[例2.6]鸡兔同笼> 题目: 2068:[例2.6]鸡兔同笼 时间限制: ...

  7. 信息学奥赛一本通 第五版(C++版)

    信息学奥赛一本通 第五版(C++版)第一部分 C++语言 第一章 C++语言入门 第二节 C++语言程序设计 P15 1. 编写一个能够输出Hello,World!的程序,这个程序常常作为一个初学者接 ...

  8. 信息学奥赛一本通 1244:和为给定数 通过

    我的信息学奥赛一本通个人主页:信息学奥赛一本通(C++版)在线评测系统http://ybt.ssoier.cn:8088/userinfo.php?name=15276768892 1244:和为给定 ...

  9. #并查集#SSL 2342 信息学奥赛一本通 1386 打击犯罪

    信息学奥赛一本通链接 题目 求最少打击的团伙数,并且使最大的团伙危险程度不超过n/2. 分析 从nnn到111逆向枚举,每次把点kkk加入图中,也就是删掉1∼k−11\sim k-11∼k−1,剩余k ...

最新文章

  1. python123动物重量排序_python基本常识
  2. CTFshow php特性 web91
  3. RxJava2学习笔记(3)
  4. QTcreator 多线程(生产者消费者)
  5. 限制部分Postfix用户只能内部收发的例子(完整版)
  6. stm32 薄膜键盘原理_市面上的笔记本键盘优缺点解析,看完秒懂
  7. 基于JAVA+SpringMVC+MYSQL的自动排课系统
  8. Vue源码解析:虚拟dom比较原理
  9. 高效编排有状态应用——TiDB 的云原生实践与思考
  10. 实验六:流类库与I/O
  11. java程序员挣外快_Java程序员如何赚外快
  12. 树莓派安装Homeassistant智能家居
  13. Codecraft-18 and Codeforces Round #458 (Div. 1 + Div. 2, combined) G. Sum the Fibonacci(子集卷积)
  14. 什么是营销SaaS?
  15. 在注册表里查找classid
  16. 有人知道要怎么用c++提取出文本里面的信息吗,例如把这个表格里的所有住户账号,密码提取出来
  17. first diary
  18. 论文解读 | LGD:用于物体检测的标签引导自蒸馏
  19. iOS 动态改变应用图标
  20. php 502状态码,PHPstorm浏览器打开预览出现502状态码,怎么办?

热门文章

  1. wpf(第一个应用实例)
  2. 身为数据科学家怎么能不掌握这四大技能!
  3. 隔离式BUCK之参数计算
  4. php5.6 xdebug 配置,php5.5+apache2.4+mysql5.6+xdebug配置
  5. 微软再出手!这次要干翻 IDEA 了。。
  6. 现在的00后都这么牛X的吗?
  7. SpringBoot三招组合拳,手把手教你打出优雅的后端接口
  8. 双非硕士阿里大数据开发面经(已拿offer)
  9. 字节跳动的敌人只有时间
  10. 2020中国DevOps社区峰会(成都站),雄关漫道,砥砺前行