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 ...
随机推荐
- Tomcat_异常_02_IOException while loading persisted sessions: java.io.EOFException
异常原因: EOFException表示输入过程中意外地到达文件尾或流尾的信号,导致从session中获取数据失败. 这是由于tomcat上次非正常关闭时有一些活动session被持久化(表现为一些临 ...
- 【leetcode刷题笔记】Best Time to Buy and Sell Stock III
Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...
- 关于Windows与Linux下32位与64位开发中的数据类型长度的一点汇总
32位与64位的数据类型长度是不一样的,而且windows和linux也有些许区别,下面把64位下的数据长度列表如下(无符号unsigned和有符号的长度一样): linux64 ...
- github 在线 创建文件夹
参考: http://webapps.stackexchange.com/questions/36411/create-a-folder-in-github-via-the-web-interface
- 洛谷【P3379】【模板】最近公共祖先(LCA)
浅谈\(RMQ\):https://www.cnblogs.com/AKMer/p/10128219.html 题目传送门:https://www.luogu.org/problemnew/show/ ...
- 堆排序的JavaScript实现
思想 把数组当做二叉树来排序: 索引0是树的根节点: 除根节点外,索引为N的节点的父节点索引是(N-1)/2: 索引为N的节点的左子节点索引是 2*N+1; 索引为N的节点的右子节点索引是 2*N+2 ...
- Centos6.5命令行快捷键
ctrl+a打开一个新的终端 ctrl+l 清除屏幕内容 ctrl+a 切换到命令行开始ctrl+e 切换到命令行末尾ctrl+u 剪切光标之前的内容ctrl+k 剪切光标之后的内容 Ctrl+-&g ...
- HDOJ1015(简单深搜)
Safecracker Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- HDOJ2043(JAVAset容器练习)
import java.io.PrintWriter; import java.util.HashSet; import java.util.Scanner; public class Main { ...
- C#使用NPOI将DataGridView内数据写入电子表格Excel
NPOI能够在用户没有安装office的情况下读写office文件,包括.xls/.doc/.ppt等类型的文件.本文介绍的是使用NPOI库内的函数读写Excel(.xls)内的内容.在使用NPOI之 ...