小木棍(洛谷-P1120)
题目描述
乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过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)相关推荐
- 洛谷[P1120 小木棍]
洛谷[P1120 小木棍] 题目: 思路: 枚举小木棒可能的长度,从数组最大值开始枚举,这个值能被总长度整除才是可行的 在使用dfs枚举小木棒的每一种可能,如果不可能就找下一个可能的长度开始枚举 注意 ...
- sscanf小技巧-洛谷P7911 网络连接
sscanf小技巧-洛谷P7911 网络连接 序言 本题解来源:本蒟蒻上课摸鱼 (别学我) 最近学了一个挺好用的函数--sscanf(),结合洛谷P7911 网络连接讲一下. (点击查看题目) 推荐几 ...
- 洛谷 P1120 小木棍 题解
这就是一道明显的爆搜题(人家洛谷也说了,,,),只是需要几个小小的优化,接下来为大家介绍一下: 1.将木棍先排个序(用处后面会讲),记住 长度>50 的要去掉 2.因为每一根的长度都不大于50, ...
- AC日记——小木棍【数据加强版】 洛谷 P1120
题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度,编 ...
- 洛谷P1120小木棍
肝了一天的题了,求过 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过 5050. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度 ...
- KMP算法小总结 洛谷P3375 【模板】KMP字符串匹配
提问:这里有一个长度为n的字符串str1和长度为m的字符串str2(n > = m),问在str1中str2出现了几次? 如果使用暴力求解,一个一个比较,在n和m都极大的情况下将花费非常多的不必 ...
- 洛谷P1120小木棒 爆搜+剪枝
题解 暴搜的思路容易想到,但是剪枝细节有很多,数据很强. 搜索思路: a. 用dfs(left_num,left_len,bound)表示当前还需要拼left_num根木棒,当前正在拼的木棒还剩lef ...
- 洛谷 小木棍(暴力+剪剪剪剪枝)
题目链接: 小木棍 - 洛谷 思路: 如果只考虑暴力,做法很简单,枚举所有可能的最终长度,都跑一遍dfs,取最小结果即可,本题难就难在大量的剪枝,具体见代码. 我的思路也是参考了大佬的博客:题解 P1 ...
- 洛谷-P1125-笨小猴
[NOIP2008 提高组] 笨小猴 - 洛谷 解题思路: 1.由题可得,输入一个只包含字母的字符串,那么用string str 来表示,判断里面字母出现最多的次数和最少的次数,max和min 2.如 ...
最新文章
- scrapy中使用代理cookies user-agent
- 高德地图如何将比例尺放大到10米?
- DJANGO,获取当前用户名,用户组名,用户组权限
- Ext Store Proxy Ajax
- 阿里云,并不是比谁聪明,而是更早面临那些疼痛
- 面向对象(Python):学习笔记之异常
- 64位虚拟机Guest OS安装错误:0xC0000225
- vs2008中文版提供下载(包含中文msdn)
- win10修改dns服务器命令,Win10怎么更改首选DNS服务器地址?
- 怎么在计算机中添加电脑桌面,如何在电脑正在使用的主题中添加桌面背景图片...
- uniapp接入支付宝登录及订阅消息教程
- 渗透火狐浏览器设置代理
- How to debug Windows bugcheck 0x9F, parameter 3
- 关于Storyboard故事板, Segue 的使用,storyboard的拆分
- “有心杀敌,无力回天”的无奈
- vb wps 链接单元格_使用VB快速制作WPS的COM加载项
- 台式计算机常用哪些主板结构,一种台式计算机用主板的制作方法
- 计算机主板的安装过程,电脑主板安装四大步骤全程讲解
- Windows消息拦截技术的应用(Hook钩子)
- easyui-filebox 限制上传格式
热门文章
- ASP.NET组件设计Step by Step(8)
- 人口吸引力超宁波、南京,这座背靠上海的小城开挂了?
- 最新!全球学术排名出炉:22所中国大学位居世界100强
- 大数据如何促进经济增长?中国优势及应对 | 互联网经济学
- 数据分析李小璐PG one出轨门自卫反击战
- STM32之SysTick原理
- 图像sobel梯度详细计算过程_视频处理之Sobel【附源码】
- 领导看了我写的关闭超时订单,让我出门左转!
- 腾讯再发股票吸引人才,受益2.57万名员工,人均超8万港元
- 数据源管理 | 基于DataX组件,同步数据和源码分析