小木棍Sticks【传送门】

算法的话:dfs+超强剪枝;

(另外注意UVA上好像不接受万能头[因为万能头WA了两次,瑟瑟发抖])

思路:

最直接的思路,枚举木棍长度来dfs,但这样很容易就TLE了。

dfs的四项关键字:

1.num:剩多少切割后的木棍没有使用;
2.rest:还需要rest的长度可以凑成一个切割前的木棍;
3.len:切割前的木棍长度;
4.last:当前切割后的木棍起始的下标;(对于初始状态dfs last是1还是0好迷啊,好像初始状态是1或者0都可以ac???) 行吧就当我没说亲测不行qwq

目标条件:num=0且rest=0;

剪枝1:对于这些木棍来说,无论怎样分,若满足条件,那么木棍长度一定是总和的倍数;

剪枝2:搜索上下界:上界:所有木棍的长度和,下界:最长一根木棍的长度;

剪枝3:将切割后的木棍按从大到小排列,对于一根切割后木棍,如果它不能满足拼成一根长度为len的木棍,那么它之前的比它长的也显然不行,因此last的作用就是减少枚举次数,每次从上一次的last+1枚举就可以了;

剪枝4:如果一根木棍的长度>rest,那么对于每一根长度与之相同的木棍都不可能组合,直接跳过减少枚举次数;

剪枝5:如果当前切割后的木棍长度=len,但组装失败(如果成功就已经return true了)即返回false,因为从大到小排序,当前的切割后木棍明明可以组成成功,但后面的切割后的木棍却组成失败,说明后面的切割后的木棍长度不够或者直接构不成(剩下的切割后的任意长度和!=切割前的木棍长度),那么继续搜肯定不行;????

#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n, mg[], tmp, top = , tt = , vis[],T; int cmp(int a, int b) {
return a > b;
}
bool dfs(int num , int len , int rest , int last ) {
if (rest == && num == )
return ;
if (num == )//没有木棍,不能拼成的情况
return ;
if (rest == ) {//如果现在刚好组成一根木棍,更新rest变为枚举的切割前木棍的长度
rest = len;
last = ;//last再次更新为0
}
for (int i = last + ; i < top; i++) { //剪枝3
if (vis[i])
continue;
if (mg[i] > rest) {
while (mg[i] == mg[i + ] && i < top) i++; //剪枝4
continue;
}
vis[i] = ;
if (dfs(num - , len, rest - mg[i], i))//选择这根木棍后继续递归,判断是否可以构成一根木棍
return ;
vis[i] = ;
if ((mg[i] == rest) || (len == rest))//剪枝5:这句话亲测对于提速还是很有效的
break;
while (mg[i] == mg[i + ] && i < top) i++;
}
return ;
}
int main() {
while(){//while循环来输入多组数据
memset(mg,,sizeof(mg));//因为处理多组数据,所以记得清空数组
memset(vis,,sizeof(vis));
tt = ;top = /*count number*/;
cin>>n;
if(n == ) return ;
for (int i = ; i <= n; i++) {
cin >> tmp;
mg[top++] = tmp,/*存到数组里*/ tt += tmp;//求和
}
sort(mg + , mg + top, cmp);//从大到小排序
for (int i = mg[]; i <= tt; i++) {//剪枝2
if (tt % i != )//剪枝1
continue;
if (dfs(top - /*因为最后top会在这n个数的基础上+1,故dfs起点为top-1*/, i, i, )) {//if this i is ok to make sticks,just choose it and break;
cout << i <<endl;
break;
}
}
} return ;
}

立下凌云壮flag,咱今天绝对不理yy,咱不烦yy,咱不让yy烦

end-

【洛谷UVA307】小木棍Sticks的更多相关文章

  1. 洛谷P1120 小木棍

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

  2. 洛谷P1120 小木棍 [数据加强版](搜索)

    洛谷P1120 小木棍 [数据加强版] 搜索+剪枝 [剪枝操作]:若某组拼接不成立,且此时 已拼接的长度为0 或 当前已拼接的长度与刚才枚举的长度之和为最终枚举的答案时,则可直接跳出循环.因为此时继续 ...

  3. 洛谷P1120 小木棍(sticks数据加强版)

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

  4. 【题解】洛谷P1120 小木棍(搜索+剪枝+卡常)

    洛谷P1120:https://www.luogu.org/problemnew/show/P1120 思路 明显是搜索题嘛 但是这数据增强不是一星半点呐 我们需要N多的剪枝 PS:需要先删去超出50 ...

  5. 洛谷P1120小木棍[DFS]

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

  6. 洛谷 P1120 小木棍 [数据加强版]解题报告

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

  7. [UVA307]小木棍 Sticks

    题目大意:有一堆小木棍,把它们接成相同长度的小木棍,问结果的小木棍的最小长度是多少,多组数据 题解:$dfs$,各种剪枝. 卡点:无 C++ Code: #include <cstdio> ...

  8. 洛谷P1120 小木棍 [搜索]

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

  9. [洛谷P1120]小木棍 [数据加强版]

    题目大意:有一些同样长的木棍,被切割成几段(长$\leqslant$50).给出每段小木棍的长度,找出原始木棍的最小可能长度. 题解:dfs C++ Code: #include<cstdio& ...

  10. 洛谷——P1120 小木棍 [数据加强版]

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

随机推荐

  1. frontend-dev面试

    1.笔试题 vuex 存储的数据为null或者undefined是为啥? 1.伸缩布局 flex规则 2.横向布局的实现方法有多少? 3.说一说 flex:1; 的含义 / 说一说flex:1 1 3 ...

  2. Dubbo源码学习总结系列三 dubbo-cluster集群模块

    Dubbo集群模块的目的是将集群Invokers构造一个透明的Invoker对象,其中包含了容错机制.负载均衡.目录服务(服务地址集合).路由机制等,为RPC层提供高可用.高并发.自动发现.可治理的S ...

  3. 后台PDF返回Base64,前台接收预览

    读取已存在的PDF文件,path为绝对路径 string base64String = "";byte[] buffer=null; using (FileStream fs = ...

  4. Xshell设置密钥登录确保Linux

    用Xshell设置密匙登陆服务器, 第一步.使用Xshell生成密钥 我们打开熟悉的XSHELL软件,然后在工具-新建用户密钥生成向导. 到了生成密钥参数界面,我们这里需要选择RSA密钥类型,以及密钥 ...

  5. 消灭 Java 代码的“坏味道”

    消灭 Java 代码的“坏味道” 原创: 王超 阿里巴巴中间件 昨天 导读 明代王阳明先生在<传习录>谈为学之道时说: 私欲日生,如地上尘,一日不扫,便又有一层.着实用功,便见道无终穷,愈 ...

  6. VS2012 改C# 模版

    原始文件位置: C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ItemTemplatesCache\CSharp\Co ...

  7. Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) - C

    题目链接:http://codeforces.com/contest/831/problem/C 题意:给定k个评委,n个中间结果. 假设参赛者初始分数为x,按顺序累加这k个评委的给分后得到k个结果, ...

  8. Java 多态概念、使用

    1.概念 2.多态的格式与使用 package Java12; /* 代码当中体现多态性,其实就是一句话: 父类引用指向子类对象 格式: 父类名称 对象名 = new 子类名称(): 或者: 接口名称 ...

  9. django之请求和响应

    一:请求 1. 浏览器向服务器传参的几种方式: 方式一:通过正则的形式进行传递,名字为未命名模式 路由的正则形式: from django.conf.urls import url from . im ...

  10. SpringBoot---事务支持

    1.自动配置的事务管理器 1.1.使用JDBC  作为 数据访问技术  时,SpringBoot  为我们  定义了  PlatformTransactionManager的实现  DataSourc ...