【poj1011】 Sticks
http://poj.org/problem?id=1011 (题目链接)
题意
给出一大堆小棍子的长度,需要把他们拼成几根长度相等的大棍子,求大棍子的最短长度。
Solution
经典搜索题,剪枝剪到手软。
要得到最小的原始木棍长度,可以按照分段数的长度,依次枚举所有的可能长度L。每次枚举L时,dfs判断是否能用小木棍拼合出整数个L。如果不剪枝,就等着狂TLE吧。
最优性:
1.所有木棍的长度和一定能一定能整除大木棍长度L。
2.大木棍长度一定>=小木棍最长长度。
可行性:
3.一只长木棍肯定比几枝短木棍拼成同样长度的用处小,即短小的可以更灵活组合,所以可以对输入的所有木棍按长度排序。
4.当用木棍i拼合大木棍时,可以从第i+1后的木棍开始搜。因为根据剪枝3,i前面的木棍已经用过了。
5.用当前最长长度的木棍开始搜,如果拼不出当前设定的L,直接return。
6.相同长度的木棍不要搜多次。
7.判断搜到的几根木棍组成长度是否大于L,若大于,return。
8.判断当前剩下的木棍根数是否够拼的木棍数。
这里用了一个小小的技巧,函数互相调用,详情见代码。
代码
// poj1011
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf 2147483640
#define Pi 3.1415926535898
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; int n,m,ans,length,a[100010],times,sum;
bool b[100010],flag; void fit(int x);
void dfs(int x,int len,int lev) {
if (len==length) {fit(x+1);return;}
for (int i=lev+1;i<=n;i++)
if (!b[i] && len+a[i]<=length) {//剪枝5,7
if (n-times+1<ans-x) return;//剪枝8
b[i]=1;
times++;
dfs(x,len+a[i],i);
times--;
b[i]=0;
int j=i;
if (flag) return;
while (i<n && a[i]==a[j]) i++;//剪枝6
if (i==n) return;
if (i!=j) i--;
}
}
void fit(int x) {
int t;
if (x>=ans) {flag=1;return;}
for (int i=1;i<=n;i++) if (!b[i]) {t=i;break;}//剪枝4
b[t]=1;
times++;
dfs(x,a[t],t);
times--;
b[t]=0;
}
bool cmp(int a,int b) {return a>b;}
int main() {
while (scanf("%d",&n)==1) {
if (n==0) break;
sum=0;int maxl=0;
for (int i=1;i<=n;i++) {
scanf("%d",&a[i]);
maxl=max(maxl,a[i]);
sum+=a[i];
}
sort(a+1,a+1+n,cmp);//排序,剪枝3
memset(b,0,sizeof(b));
for (int i=n;i>=1;i--) {
ans=i;length=sum/i;
if (i==1) break;
if (sum%i>0 || length<maxl) continue;//剪枝1,2
memset(b,0,sizeof(b));
times=0;
flag=0;
fit(1);
if (flag) break;
}
printf("%d\n",sum/ans);
}
return 0;
}
【poj1011】 Sticks的更多相关文章
- 【POJ1011】Sticks
[题目概括] 现在有\(n\)个长度不超过\(50\)的木棍,请你把这些小木棍拼成若干根长度相同的木棍. 请你最小化拼成后的长度. [思路要点] 考虑枚举最后的长度,然后判断是否可以,这样就不需要最优 ...
- 【bfs】拯救少林神棍(poj1011)
Description 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位.然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度.请你 ...
- 【POJ 1011】 Sticks
[题目链接] http://poj.org/problem?id=1011 [算法] 深搜剪枝 首先我们枚举木棍的长度i,那么就有s/i根木棍,其中s为木棍长度的总和,朴素的做法就是对每种长度进行搜索 ...
- 【Uva 307】Sticks
[Link]: [Description] 给你最多n个棍子; (n< = 64) 每根棍子长度(1..50) 问你这n根棍子,可以是由多少根长度为x的棍子分割出来的; x要求最小 [Solut ...
- 【转】欧拉回路&特殊图下的哈密顿回路题集
转自:http://blog.csdn.net/shahdza/article/details/7779385 欧拉回路[HDU]1878 欧拉回路 判断3018 Ant Trip 一笔画问题1116 ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- HDU 5914 Triangle 【构造】 (2016中国大学生程序设计竞赛(长春))
Triangle Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Su ...
- 【HDOJ图论题集】【转】
=============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...
- 【LeetCode】深搜DFS(共85题)
[98]Validate Binary Search Tree [99]Recover Binary Search Tree [100]Same Tree [101]Symmetric Tree [1 ...
随机推荐
- [转]解决GET请求时中文乱码的问题
原文地址:http://www.cnblogs.com/liukemng/p/4178882.html 之前项目中的web.xml中的编码设置: <filter> <filter-n ...
- 清北学堂2017NOIP冬令营入学测试P4749 C’s problem(c)
P4746 C's problem(c) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描述 小C是一名数学家,由于它自制力比较差 ...
- AR播放器
一.项目需求 AR播放器:将一系列带透明通道的图片以一定的帧率连续显示,叠加载摄像头采集的画面之上,并播放声音. 此为最初级的AR技术,因为画面是事先渲染好的,固定不变的,所以实际上并不能实现“互动” ...
- 化茧成蝶,开源NetWorkSocket通讯组件
前言 前后历时三年,期间大量参考.Net Framework和Asp.net MVC源代码,写写删删再重构,组件如今更新到V1.5.x了.从原来的丑小鸭,变成今天拥有稳定和强大的tcp协议支持基础层, ...
- linux定时任务生产java服务无法执行问题案例
我写了一个重启resin的脚本,由于业务原因,需要定时在某一个时间重启下resin服务器 于是就在crontab里配置了如下内容: * * - root /usr/local/bin/resin_re ...
- LAMP安装各种问题解决方案
LAMP环境配置安装注意安装步骤及说明事项. LAMP安装各种问题解决 1. 访问ftp报错 解决: 关闭selinux vi /etc/selinux/config 内容修改为: selinux=d ...
- A query was run and no Result Maps were found for the Mapped Statement 'user.insertUser!selectKey'. It's likely that neither a Result Type nor a Result Map was specified.
使用mybatis时出现异常问题: 有如下的错误 Error querying database. Cause: org.apache.ibatis.executor.ExecutorExceptio ...
- ASP.NET MVC 5 入门教程 (4) View和ViewBag
文章来源: Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc-5-get-started-view.html 上一节:ASP.NET MVC 5 入门教 ...
- iOS开发小技巧-修改SliderBar指针的样式(牢记这个方法,只能通过代码来修改)
代码: // 修改进度条的指针图片 [self.progressSlider setThumbImage:[UIImage imageNamed:@"player_slider_playba ...
- iOS开发,系统自带的分享简单实现
由于simulator设置里面没有新浪微博的选项,所以选择了真机调试,成功了.代码不多,包含头文件 没有配置登录信息的话,是没有作用的 ...