题目描述

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

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

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

输入输出格式

输入格式:

共二行。

第一行为一个单独的整数N表示砍过以后的小木棍的总数,其中N≤65N≤65

(管理员注:要把超过5050的长度自觉过滤掉,坑了很多人了!)

第二行为NN个用空个隔开的正整数,表示NN根小木棍的长度。

输出格式:

一个数,表示要求的原始木棍的最小可能长度

输入输出样例

输入样例#1:

9
5 2 1 5 2 1 5 2 1

输出样例#1:

6

思路:dfs,由于数据加强需要进行剪枝,具体剪枝步骤见代码

源代码

#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;
}

小木棍(洛谷-P1120)相关推荐

  1. 洛谷[P1120 小木棍]

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

  2. sscanf小技巧-洛谷P7911 网络连接

    sscanf小技巧-洛谷P7911 网络连接 序言 本题解来源:本蒟蒻上课摸鱼 (别学我) 最近学了一个挺好用的函数--sscanf(),结合洛谷P7911 网络连接讲一下. (点击查看题目) 推荐几 ...

  3. 洛谷 P1120 小木棍 题解

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

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

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

  5. 洛谷P1120小木棍

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

  6. KMP算法小总结 洛谷P3375 【模板】KMP字符串匹配

    提问:这里有一个长度为n的字符串str1和长度为m的字符串str2(n > = m),问在str1中str2出现了几次? 如果使用暴力求解,一个一个比较,在n和m都极大的情况下将花费非常多的不必 ...

  7. 洛谷P1120小木棒 爆搜+剪枝

    题解 暴搜的思路容易想到,但是剪枝细节有很多,数据很强. 搜索思路: a. 用dfs(left_num,left_len,bound)表示当前还需要拼left_num根木棒,当前正在拼的木棒还剩lef ...

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

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

  9. 洛谷-P1125-笨小猴

    [NOIP2008 提高组] 笨小猴 - 洛谷 解题思路: 1.由题可得,输入一个只包含字母的字符串,那么用string str 来表示,判断里面字母出现最多的次数和最少的次数,max和min 2.如 ...

最新文章

  1. scrapy中使用代理cookies user-agent
  2. 高德地图如何将比例尺放大到10米?
  3. DJANGO,获取当前用户名,用户组名,用户组权限
  4. Ext Store Proxy Ajax
  5. 阿里云,并不是比谁聪明,而是更早面临那些疼痛
  6. 面向对象(Python):学习笔记之异常
  7. 64位虚拟机Guest OS安装错误:0xC0000225
  8. vs2008中文版提供下载(包含中文msdn)
  9. win10修改dns服务器命令,Win10怎么更改首选DNS服务器地址?
  10. 怎么在计算机中添加电脑桌面,如何在电脑正在使用的主题中添加桌面背景图片...
  11. uniapp接入支付宝登录及订阅消息教程
  12. 渗透火狐浏览器设置代理
  13. How to debug Windows bugcheck 0x9F, parameter 3
  14. 关于Storyboard故事板, Segue 的使用,storyboard的拆分
  15. “有心杀敌,无力回天”的无奈
  16. vb wps 链接单元格_使用VB快速制作WPS的COM加载项
  17. 台式计算机常用哪些主板结构,一种台式计算机用主板的制作方法
  18. 计算机主板的安装过程,电脑主板安装四大步骤全程讲解
  19. Windows消息拦截技术的应用(Hook钩子)
  20. easyui-filebox 限制上传格式

热门文章

  1. ASP.NET组件设计Step by Step(8)
  2. 人口吸引力超宁波、南京,这座背靠上海的小城开挂了?
  3. 最新!全球学术排名出炉:22所中国大学位居世界100强
  4. 大数据如何促进经济增长?中国优势及应对 | 互联网经济学
  5. 数据分析李小璐PG one出轨门自卫反击战
  6. STM32之SysTick原理
  7. 图像sobel梯度详细计算过程_视频处理之Sobel【附源码】
  8. 领导看了我写的关闭超时订单,让我出门左转!
  9. 腾讯再发股票吸引人才,受益2.57万名员工,人均超8万港元
  10. 数据源管理 | 基于DataX组件,同步数据和源码分析