题意:一组等长的木棒,将它们随机的砍掉,得到若干根小木棍,

   每一节小棍的长度都不超过50个单位。然后想把这些木棍拼接起来,恢复到裁剪前的状态,

   但忘记了初始时有多少木棒以及木棒的初始长度。计算木棒的可能最小长度,每一节木棍的长度都用大于零的整数表示。

  输入包含多组数据

这题很经典(有毒啊)

首先,对所有木棍排序(便于搜索)

然后倒着枚举初始木棒个数, 可以通过求平均算出木棒长度(最短),有解就输出(最优)

若当前个数无法被平均分,false

若当前答案比最长木棍小,false

然后开始搜索

详见代码

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define love_nmr 0
int n;
int stick[];
int ans;
int ave;
bool vis[];
inline bool dfs(int num,int pos,int len)
{
if(num==n+)return true; //全部搜完(合法了)
for(int i=pos;i<=n;i++)
{
if(vis[i]) continue; //被用过
if(stick[i]+len<ans) //接上也比ans小(可用)
{
vis[i]=true;
if(dfs(num+,i+,len+stick[i])) return true; //接上继续搜(标记)
vis[i]=false;
while(stick[i]==stick[i+]&&i+<=n)i++; //有跟他一样的跳过
}
else if(stick[i]+len==ans) //正好接上
{
vis[i]=true;
if(dfs(num+,,)) return true; //下一次从头开始
vis[i]=false;
return false;
}
if(!len)return false; //没有能跟它拼的
}
return false;
}
inline bool cmp(int a,int b)
{
return a>b;
}
int main()
{
while(~scanf("%d",&n)&&n)
{
ave=;
for(int i=;i<=n;i++)
{
scanf("%d",&stick[i]);
ave+=stick[i];
}
sort(stick+,stick+n+,cmp);
for(int i=n;i>=;i--)
{
if(ave%i==&&(ave/i)>=stick[])
{
ans=ave/i;
// cout<<ans<<endl;
memset(vis,,sizeof vis);
if(dfs(,,))
{
printf("%d\n",ans);
break;
}
}
}
}
return love_nmr;
}

UVA307 Sticks的更多相关文章

  1. UVA-307 Sticks (DFS+剪枝)

    题目大意:用n根长度未必相等的木棒匹配出最多数量的等长木棒. 题目分析:枚举所有可能的等长木棒的长度,通过DFS的方式逐根匹配,在此过程中要剪枝.先将木棒长度按从大到小排序,也就是说匹配每一根等长木棒 ...

  2. 【洛谷UVA307】小木棍Sticks

    小木棍Sticks[传送门] 算法的话:dfs+超强剪枝: (另外注意UVA上好像不接受万能头[因为万能头WA了两次,瑟瑟发抖]) 思路: 最直接的思路,枚举木棍长度来dfs,但这样很容易就TLE了. ...

  3. Sticks(poj1011/uva307)

    题目大意: 乔治有一些碎木棒,是通过将一些相等长度的原始木棒折断得到的,给出碎木棒的总数和各自的长度,求最小的可能的原始木棒的长度:(就是将一些正整数分组,每组加起来和相等,使和尽可能小) 一开始做p ...

  4. [UVA307]小木棍 Sticks

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

  5. P1120/UVA307 小木棍(sticks) 题解

    题目描述 pdf 题解 注意的问题是,各个原始木棒的长度都是一样的! 说一下本题的总思路即:DFS+超强力剪枝!(详见本人的 AC 程序) 首先,我们要从小到大枚举原始木棒的长度len,也就是枚举答案 ...

  6. HDOJ 1051. Wooden Sticks 贪心 结构体排序

    Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  7. POJ 2653 Pick-up sticks (线段相交)

    题意:给你n条线段依次放到二维平面上,问最后有哪些没与前面的线段相交,即它是顶上的线段 题解:数据弱,正向纯模拟可过 但是有一个陷阱:如果我们从后面向前枚举,找与前面哪些相交,再删除前面那些相交的线段 ...

  8. hduoj 1455 && uva 243 E - Sticks

    http://acm.hdu.edu.cn/showproblem.php?pid=1455 http://uva.onlinejudge.org/index.php?option=com_onlin ...

  9. POJ 2653 Pick-up sticks【线段相交】

    题意:n根木棍随意摆放在一个平面上,问放在最上面的木棍是哪些. 思路:线段相交,因为题目说最多有1000根在最上面.所以从后往前处理,直到木棍没了或者最上面的木棍的总数大于1000. #include ...

随机推荐

  1. Python基础-redis模块使用

    redis是一个数据库,他的数据全都是存放在内存里面的,redis每秒能支持30w次的读写,存放有两种格式,一种string类型,一种是hash类型 一,操作string类型 r=redis.Redi ...

  2. C++如何拒绝编译器自动生成的函数

    每一个class,编译器都会自动生成四个特殊成员函数: destructor(析构函数) default constructor(默认构造函数) copy constructor(copy构造函数) ...

  3. LeetCode Majority Element I

    原题链接在这里:https://leetcode.com/problems/majority-element/ 题目: Given an array of size n, find the major ...

  4. bzoj 4031: 小Z的房间 矩阵树定理

    bzoj 4031: 小Z的房间 矩阵树定理 题目: 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时 ...

  5. [转]django 日志logging的配置以及处理

    http://davidbj.blog.51cto.com/4159484/1433741 日志在程序开发中是少不了的,通过日志我们可以分析到错误在什么地方,有什么异常.在生产环境下有很大的用途.在J ...

  6. bzoj 2535 & bzoj 2109 航空管制 —— 贪心+拓扑序

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2535 https://www.lydsy.com/JudgeOnline/problem.p ...

  7. PTA实验作业-01

    一.PTA实验作业 本周要求挑3道题目写设计思路.调试过程.设计思路用伪代码描述.题目选做要求: 顺序表选择一题(6-2,6-3,7-1选一题),代码必须用顺序结构抽象数据类型封装 单链表选择一题(6 ...

  8. JavaScript-Tool:my97datepicker

    ylbtech-JavaScript-Tool:my97datepicker 1.返回顶部 1. 2.下载 https://files.cnblogs.com/files/storebook/java ...

  9. Go和HTTPS

    转自:http://tonybai.com/2015/04/30/go-and-https/ 近期在构思一个产品,考虑到安全性的原因,可能需要使用到HTTPS协议以及双向数字证书校验.之前只是粗浅接触 ...

  10. Spring5.0的第一次尝鲜

    对于这次尝鲜,说白了和Spring5.0的新特性基本没有多大的关系,如果说您不小心进来了,却发发现文章的内容和标题似乎不太匹配,那么我将是非常的抱歉,因为这浪费了您宝贵的时间.但是我还是要说:因为这确 ...