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

   每一节小棍的长度都不超过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. 属性成员是isXxx时对应的get方式是isXxx,前台jsp取不到这个属性值

    最近在项目中无意设置的boolean变量值为isXxx,用eclipse生成相应的set和get方法,eclipse生成的的boolean类型的get方法为isXxx,前台导致取不到相应的值 publ ...

  2. Oracle 12c 多租户配置和修改 CDB 和 PDB 参数

    1. 配置CDB 实例参数,影响CDB与所有 PDB为CDB配置例程参数相对于对于非CDB的数据库是变化不太.ALTER SYSTEM命令用于设置初始化参数,与使用ALTER DATABASE命令修改 ...

  3. Poj 1125 Stockbroker Grapevine(Floyd算法求结点对的最短路径问题)

    一.Description Stockbrokers are known to overreact to rumours. You have been contracted to develop a ...

  4. poj 1517 u Calculate e(精度控制+水题)

    一.Description A simple mathematical formula for e is e=Σ0<=i<=n1/i! where n is allowed to go t ...

  5. JavaScript-Tool:jquery.cookie.js

    ylbtech-JavaScript-Tool:jquery.cookie.js 1.返回顶部 1.jquery.cookie.js /*! * jQuery Cookie Plugin v1.4.0 ...

  6. 二 Akka学习 - actor介绍

    一个actorSystem 是一个重量级的结构.它会分配N个线程.所以对于每一个应用来说只用创建一个ActorSystem. Actor是种可怜的“生物”,它们不能独自存活.Akka中的每一个Acto ...

  7. 3DES加密/解密

    /// <summary> /// C#/PHP/JSP 3DES 加密与解密(只支持UTF-8编码) /// </summary> public class Crypto3D ...

  8. cygwin运行git submodule init出错error while loading shared libraries的解决

    installing the Devel\gettext package should solve your problem. git-submodule requires that. Unfortu ...

  9. 19E Fairy

    Once upon a time there lived a good fairy A. One day a fine young man B came to her and asked to pre ...

  10. 24.command-executor

    这里先给出题目链接: https://command-executor.hackme.inndy.tw/ 这是一道不错的ctf题,首先说一下考察点: 文件包含读源码 代码分析结合CVE CVE导致的命 ...