题目链接:

小木棍 - 洛谷

思路:

如果只考虑暴力,做法很简单,枚举所有可能的最终长度,都跑一遍dfs,取最小结果即可,本题难就难在大量的剪枝,具体见代码。

我的思路也是参考了大佬的博客:题解 P1120 【小木棍 [数据加强版]】 - Kaori 的博客 - 洛谷博客

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 70;
int n, x, sum=0;
int m, len; //要拼的木棍数量,长度
int a[maxn], cnt;
bool used[maxn];
bool ok = false; //当前是否拼接成功
bool cmp(int i,int j) {return i>j;}
void dfs(int cur, int last, int rest){ //当前拼的数量,最后用的木棍编号,剩下要拼的长度if(rest==0){if(cur==m) {ok=1; return;}int i;for(i=1; i<=cnt; i++)if(!used[i]) break;used[i] = 1;dfs(cur+1, i, len-a[i]);used[i] = 0;if(ok) return; //如果成功,直接返回}//二分查找第一个长度不大于rest的木棍int left = last+1, right = cnt, mid;while(left < right){mid = (left+right)>>1;if(a[mid]<=rest) right = mid;else left = mid+1;}//注意从left开始,这点很重要(从长到短逐个选择,保证顺序和灵活性)for(int i=left; i<=cnt; i++){if(used[i] || a[i]>rest) continue; //用过的或者太长的不能用if(!used[i-1]&&a[i]==a[i-1]) continue; //和前面等长,前面不能过,这个也不能used[i] = 1;dfs(cur,i,rest-a[i]);used[i] = 0;if(ok) return; //如果成功,直接返回if(rest==a[i] || rest==len) return; //特殊优化}
}
int main(){ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);cin >> n;for(int i=1; i<=n; i++){cin>>x;if(x<=50) {a[++cnt] = x; sum += x;}}sort(a+1,a+n+1,cmp); //排序优化,短木棍更加灵活,排在后面,取的时候先拿长的再拿短地for(len=a[1]; len<=sum/2; len++){if(sum%len != 0) continue; //不是整倍数,必定合不出来m = sum/len; //要拼的木棍数量ok = 0; used[1] = 1;dfs(1,1,len-a[1]);used[1] = 0;if(ok) {cout<<len; return 0;}}cout<<sum;
}

洛谷 小木棍(暴力+剪剪剪剪枝)相关推荐

  1. 【个人邀请赛】洛谷 小比赛

    前言 话说其实写这篇博客是看了之前某dalao这样写,于是我就效仿了一下 不过那位dalao据说公开赛被刷下来了,好像是因为题目过水...后来他又奋发图强,出了几个稍微难一点的题,不过还是没有通过,深 ...

  2. 洛谷小游戏大全(用洛谷的人都得知道)

    洛谷小游戏大全网址: www.luogu.com.cn/paste/1agz1vs7 其实就是洛谷首页网址加 paste/1agz1vs7 云剪贴板 - 洛谷https://www.luogu.com ...

  3. 洛谷P1233 木棍加工

    题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间为1分钟: 如果刚处理 ...

  4. 洛谷——小凯的疑惑 / [蓝桥杯 2013 省] 买不到的数目

    题目背景 NOIP2017 提高组 D1T1 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的.现 ...

  5. 洛谷-小清新人渣的本愿-(莫队+bitset)

    小清新人渣的本愿 题意: 就是给你一个数组,然后有3种查询,分别是问你l到r区间内,是否有两个数的差等于x,只和等于x,乘积为x. 思考: 其实看到,感觉就挺复杂的,没办法去找这种关系对,除了乘积为x ...

  6. 洛谷[P1120 小木棍]

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

  7. 小木棍(洛谷-P1120)

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

  8. 洛谷 P1120 小木棍 题解

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

  9. 洛谷P1120小木棍

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

最新文章

  1. DOM(Document object madle) 文档对象模型: 元素节点 文本节点 属性节点
  2. 复制迁移数据库表数据程序
  3. actionscript3 事件类型
  4. 实现iOS App的在线安装
  5. Vue.nextTick和Vue.$nextTick
  6. CentOS 7安装Hadoop 3.0.0
  7. GRUB与Linux系统修复(第二版)
  8. 基于Kubernetes(k8s)的RabbitMQ 集群
  9. SAP ERP与国内ERP系统的对比,为什么建议选SAP
  10. 中晋最新消息2020年_最新消息!洛阳市第一高级中学发布2020年招生简章
  11. windows系统搭建redis集群
  12. 记录下selenium登陆126邮箱
  13. wp8通过WebClient从服务器下载文件
  14. 自考-计算机程序设计-1-概论
  15. 2300. 咒语和药水的成功对数 ●●
  16. xlsm java 读取_使用POI读/写XLSM
  17. HDU 5441并查集 by cyl
  18. SyntaxError: Non-UTF-8 code starting with ‘\xe6‘ in file C:/Users/0moyi0/Desktop/DeepLearningExample
  19. 深入理解Android系统网络架构
  20. 学java被“劝退”的第八天

热门文章

  1. Java读取Hdfs的文件数据出现乱码的解决方案和办法
  2. [2019蓝桥杯国赛B组c++][最优包含][排列数][解谜游戏][第八大奇迹]
  3. Web-AK47网络验证码攻击工具
  4. 出现`webpack-dev-server --inline --progress --config build/webpack.dev.conf.js`报错
  5. Google 的封杀与被封杀
  6. Python二级应用题代码自用(无忧二级)
  7. 全国大学生数学建模竞赛禁用MATLAB?这届哈工大学生太难了
  8. 手把手教你用Python分析豆瓣电影——以《我不是药神》《邪不压正》为例
  9. [英语阅读]投机者-Lame duck
  10. 深入浅出Python机器学习9——数据预处理、降维、特征提取及聚类