UVA307 Sticks
题意:一组等长的木棒,将它们随机的砍掉,得到若干根小木棍,
每一节小棍的长度都不超过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的更多相关文章
- UVA-307 Sticks (DFS+剪枝)
题目大意:用n根长度未必相等的木棒匹配出最多数量的等长木棒. 题目分析:枚举所有可能的等长木棒的长度,通过DFS的方式逐根匹配,在此过程中要剪枝.先将木棒长度按从大到小排序,也就是说匹配每一根等长木棒 ...
- 【洛谷UVA307】小木棍Sticks
小木棍Sticks[传送门] 算法的话:dfs+超强剪枝: (另外注意UVA上好像不接受万能头[因为万能头WA了两次,瑟瑟发抖]) 思路: 最直接的思路,枚举木棍长度来dfs,但这样很容易就TLE了. ...
- Sticks(poj1011/uva307)
题目大意: 乔治有一些碎木棒,是通过将一些相等长度的原始木棒折断得到的,给出碎木棒的总数和各自的长度,求最小的可能的原始木棒的长度:(就是将一些正整数分组,每组加起来和相等,使和尽可能小) 一开始做p ...
- [UVA307]小木棍 Sticks
题目大意:有一堆小木棍,把它们接成相同长度的小木棍,问结果的小木棍的最小长度是多少,多组数据 题解:$dfs$,各种剪枝. 卡点:无 C++ Code: #include <cstdio> ...
- P1120/UVA307 小木棍(sticks) 题解
题目描述 pdf 题解 注意的问题是,各个原始木棒的长度都是一样的! 说一下本题的总思路即:DFS+超强力剪枝!(详见本人的 AC 程序) 首先,我们要从小到大枚举原始木棒的长度len,也就是枚举答案 ...
- HDOJ 1051. Wooden Sticks 贪心 结构体排序
Wooden Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- POJ 2653 Pick-up sticks (线段相交)
题意:给你n条线段依次放到二维平面上,问最后有哪些没与前面的线段相交,即它是顶上的线段 题解:数据弱,正向纯模拟可过 但是有一个陷阱:如果我们从后面向前枚举,找与前面哪些相交,再删除前面那些相交的线段 ...
- hduoj 1455 && uva 243 E - Sticks
http://acm.hdu.edu.cn/showproblem.php?pid=1455 http://uva.onlinejudge.org/index.php?option=com_onlin ...
- POJ 2653 Pick-up sticks【线段相交】
题意:n根木棍随意摆放在一个平面上,问放在最上面的木棍是哪些. 思路:线段相交,因为题目说最多有1000根在最上面.所以从后往前处理,直到木棍没了或者最上面的木棍的总数大于1000. #include ...
随机推荐
- C++11 右值引用 与 转移语义
新特性的目的 右值引用(R-value Reference)是C++新标准(C++11, 11代表2011年)中引入的新特性,它实现了转移语义(Move Semantics)和精确传递(Perfect ...
- 【leetcode刷题笔记】Populating Next Right Pointers in Each Node II
What if the given tree could be any binary tree? Would your previous solution still work? Note: You ...
- bzoj 3727: Final Zadanie 思维题
题目: Description 吉丽YY了一道神题,题面是这样的: "一棵n个点的树,每条边长度为1,第i个结点居住着a[i]个人.假设在i结点举行会议,所有人都从原住址沿着最短路径来到i结 ...
- Android的各国语言的缩写
语言包在android工程中的对应关系: 中文(中国):values-zh-rCN 中文(台湾):values-zh-rTW 中文(香港):values-zh-rHK 英语(美国):values-en ...
- rsync同步文件,排除多个文件/目录
使用rsync -aP --exclude=upload 只能排除upload文件/目录.如果要排除多个文件/目录,怎么办? 那只能建一个exclude.list,里面填写要排除的目录(一行一个文件 ...
- stm32 奇怪的位赋值问题 出错了
转载请注明出处:http://blog.csdn.net/qq_26093511/article/category/6094215 1.在51单片机里 ,下面这两种操作方法都是一样的,没有什么问题! ...
- 【opencv学习笔记八】创建TrackBar轨迹条
createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...
- Android开发者学习必备:10个优质的源码供大家学习
最近看了一些开发的东西,汇总了一些源码.希望可以给大家有些帮助! 1.Android 源码解析—PagerSlidingTabStrippagerSlidingTabStrip 实现联动效果的原理是, ...
- linux命令-tar工具详解
把文件和目录打成一个包 文件打包 [root@wangshaojun ~]# tar -cvf 1.tar 1.txt 123 234 ///-c创建 -v可视化 -f file放最后面1.txt12 ...
- C++之vector模板类
vector 称为容器模板类,是同一种类型的对象的集合,每个对象都有一个对应的整数索引值.vector 不是一种数据类型,而只是一个类模板,可用来定义任意多种数据类型.vector 类型的每一种都指定 ...