Sticks (POJ - 1011 ,DFS + 强力剪枝)

poj1011木棒 dfs 木棒 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 143464   Accepted: 33889 Description 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位。然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初 阅读详情

一.题目链接:

POJ-1011

二.题目大意:

给你 n 个小木棍,要求将其中不超过 50 长度的木棍拼成若干个木棒.

并且使木棒的长度均相同,最后输出木棒的最小长度.

三.分析:

这道 dfs 剪枝快剪成 O(1) 了。。。

①:确定答案的的范围:答案必定比最长木棍长 且 必定为不超过 50 木棍长度和的约数.

②:优化搜索顺序.

③:vis 标记去重 + 最优性剪枝 + 排除等效冗余剪枝.

④:空木棒的等效剪枝 + 贪心剪枝.

详见代码.

四.代码实现:

#include <set>
#include <map>
#include <ctime>
#include <queue>
#include <cmath>
#include <stack>
#include <bitset>
#include <vector>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define eps 1e-8
#define lc k * 2
#define rc k * 2 + 1
#define pi acos(-1.0)
#define ll long long
#define ull unsigned long long
using namespace std;

const int M = (int)1e2;
const int mod = 99991;
const int inf = 0x3f3f3f3f;

int a[M + 5];
bool vis[M + 5];
int n, m, x, sum, len, cnt;

bool cmp(int a, int b)
{
    return a > b;
}

bool dfs(int num, int have, int last)
{
    if(num > cnt)
        return 1;
    if(have == len)
        return dfs(num + 1, 0, 1);
    int fail = 0;
    for(int i = last; i <= n; ++i)
    {
        if(!vis[i] && have + a[i] <= len && fail != a[i])
        {
            vis[i] = 1;
            if(dfs(num, have + a[i], i + 1))
                return 1;
            vis[i] = 0;
            fail = a[i];
            if(!have || have + a[i] == len)
                return 0;
        }
    }
    return 0;
}

int main()
{
    while(~scanf("%d", &n) && n)
    {
        m = sum = len = 0;
        for(int i = 1; i <= n; ++i)
        {
            scanf("%d", &x);
            if(x > 50)  continue;
            a[++m] = x;
            sum += x;
            len = max(len, x);
        }
        n = m;
        sort(a + 1, a + n + 1, cmp);
        for( ; ; ++len)
        {
            if(sum % len)   continue;
            cnt = sum / len;
            memset(vis, 0, sizeof(vis));
            if(dfs(1, 0, 1))   break;
        } 
        printf("%d\n", len);
    }
    return 0;
}

 

产业园区如何高效对接企业技术需求与高校科研成果?.docx 科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。 立即下载

相关推荐

从零构建:ESP32S3无线DAP-Link调试器的硬件与软件协同设计

本文详细介绍了基于ESP32S3的无线DAP-Link调试器的硬件与软件协同设计,涵盖关键元器件选型、无线通信协议优化、双核任务处理及低功耗调试方案。通过ESP-NOW协议实现低延迟无线调试,结合USB协议栈与双核协同,为嵌入式开发提供高效灵活的调试解决方案。

gitlab7runner的博客 859

POJ-1011-Sticks

题目链接:http://poj.org/problem?id=1011 这道题用到了深搜+剪枝。 #include #include #include using namespace std; int a[65]; int vis[65]; int n; int cmp(int x,int y) { return x>y; } int dfs(int len,int need,int

Aaron's Home 1089

深入CRSF协议数据包:手撕STM32代码,教你像调试串口一样分析ELRS遥控数据流

本文深入解析CRSF协议数据包,通过手撕STM32代码,教你如何像调试串口一样分析ELRS遥控数据流。从硬件准备到数据包捕获状态机设计,再到高级数据分析技巧和实战应用,全面覆盖CRSF协议的解析与优化,帮助开发者构建稳定可靠的通信系统。

weixin_29194693的博客 337

poj 木棒

#include #include #include #include #include #include using namespace std; int total, mx,sum; int sticks[100]; bool used[100]; bool dfs(int tobuild, int localleft, int totalleft,int tr){ //tobuild表示尝

baby的专栏 933

给大一新生的蓝桥杯EDA备赛规划:从电路分析到立创EDA,如何用一年时间高效备赛?

本文为大一新生提供了一份系统的蓝桥杯EDA备赛规划,从电路分析基础到立创EDA实战操作,分阶段指导如何高效备赛。内容涵盖理论学习、软件操作、PCB设计专项提升及冲刺优化策略,帮助学生在一年内全面提升电子设计能力,为竞赛做好充分准备。

weixin_31476015的博客 287

海思ISP调优实战:从实验室到真实场景的IPC相机图像质量优化指南

本文深入探讨海思ISP调优在IPC相机图像质量优化中的实战应用,从实验室标定到真实场景部署的全链路调优方法。重点解决光照动态范围、色温变化和噪声特性等核心问题,提供AE权重表配置、CCM标定、3DNR时域滤波等关键技术方案,帮助实现从理论到实践的图像质量提升。

s3t4u的博客 750

Sticks(经典深搜+剪枝)

#include &lt;iostream&gt; #include &lt;algorithm&gt; using namespace std; //total能组成的木棒的组数,l:组成的木棒的长度 int total,l; //num:输入的整数,sum:总长度 int num,sum; typedef struct { int length;//木棒的长度 bool ma...

Cybenko 3334

Vue3多级路由缓存失效的深度解析与实战解决方案

本文深度解析了Vue3项目中多级路由嵌套下keep-alive缓存失效的根本原因,并提供了三种实战解决方案。通过剖析组件树、router-view与keep-alive的协作机制,揭示了缓存无法穿透多层router-view的技术本质。文章对比了路由扁平化重构、状态管理配合路由守卫以及使用社区插件等方案的优缺点与适用场景,为开发者解决这一常见难题提供了清晰的选型指导。

weixin_29001423的博客 271

uniapp [全端兼容] - 详细实现下拉筛选菜单功能组件,下拉式筛选菜单效果,类似电商美团点击筛选项底部弹出列表点击选择后自动收起(详细示例代码,全端兼容小程序、安卓苹果app、h5网页、nvue

uni-app,vue2,vue3,向下弹出菜单包含筛选功能,日期筛选,下拉框选择器,下拉多条件筛选,下拉式筛选菜单,uniApp如何实现条件下拉筛选,Uniapp官方条件筛选组件,下拉框式条件筛选插件组件,最好用的插件组件,多端兼容,下拉菜单筛选,过滤筛选列表,下拉筛选栏,多列联动的条件筛选,下拉菜单地区和筛选,微信小程序,支付宝小程序,h5网页,移动端网站,安卓app,苹果app,nvue,uniapp所有平台兼容,下拉菜单筛选,下拉式条件筛选,下拉列表,点击排序,级联筛选,uniapp实现下拉筛选

🏆 前端领域优质创作者 1万+

Power domain 划分该如何下手

假如PD1比PD3更always on的话,我们只需要插入普通buffer即可,因为PD3 on,PD1也肯定是ON,PD1 off,PD3肯定时off,PD1能cover PD3的电源情况,因此使用普通buffer也可,但是处于省电角度,我们还是使用AO buffer;在我们做多power domain时,在切分power domain时,需要谨慎,稍有不慎,就会出现congestion以及timing问题,那问题来了,我们在切分power domain时有什么考究么,今天小编就和大家一起讨论讨论。

芯冰乐 207

Sticks POJ - 1011

借鉴的这个人的 题解: 说一下三条剪枝函数,当运行到剪枝函数,可以理解为搜索失败了。 1.第一个剪枝:如果当前搜索a[i]时,发现因为a[i]的原因不能使木棍分成等长的几部分,当goal等于a[i]时,也就不需要在搜索了。 2,第二个剪枝:(引上面博客内容)假设 要搜索目标长度为 7 :绳长有 7 6 3 2 2. 假设 第一个7 搜索完,接下来搜索6 发现6没有1来配对,程序会接...

qq_40240576的博客 357

Android平台实现Airplay的方法及源代码

Airplay是由苹果公司推出的一项无线音视频传输技术,它允许用户将音频、视频和照片从iOS设备(如iPhone、iPad)或Mac电脑无线传输到支持Airplay的设备(如Apple TV、智能音箱等)。具体的解码和播放方式取决于你选择的库和技术。当Android设备启动AirplayService服务后,它将监听来自iOS设备的连接请求,并在建立连接后接收、解码和播放音视频数据。在AirplayService类的onStartCommand()方法中,我们需要处理Airplay的请求。

CyberLynxX的博客 1600

POJ 1011 Sticks (DFS +强力剪枝 (经典))

Sticks

Tc的专栏 985

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

POJ/UVA307 1011 Sticks (DFS +强力剪枝 (经典))

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;page=show_problem&amp;problem=243题意:有n根木棍,要求将所有木条拼接成等长的若干木条,求原始拼接长度的最小值分析:dfs+剪枝题目说拼接总长度不大于50,数组长度要开到100以上吧(因为这个问题,t了我好久) ...

running_acmer的博客 277

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Poj 1011:sticks通俗易懂 大法师+强力剪枝

题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过5050。 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度。 给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度。 输入格式 共二行。 第一行为一个单独的整数N表示砍过以后的小木棍的总数,其中N≤65N≤65 (管理员注:要把超过5050的长度自觉过滤掉,坑了很多人了!) 第...

csyifanZhang的博客 553

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

poj 1011 Sticks

<br />//poj 1011 经典搜索题<br />//http://www.cnblogs.com/eclipse9614/archive/2010/05/24/POJ1011.html<br />//这位老兄解题报告的第三点是最强力的,不过要配合其他剪枝才能过,0MS。。。<br />#include <iostream><br />#include <algorithm><br />using namespace std;<br />int n,sum;<br />int len[70];<br

birdforever的专栏 587

4.3.5 Sticks (POJ1011)

Problem Description George took sticks of the same length and cut them randomly until all parts became at most 50 units long. Now he wants to return sticks to the original state, but he forgo...

weixin_30872867的博客 73

POJ 1011 DFS的经典问题

Sticks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 101433   Accepted: 23065 Description George took sticks of the same length and cut them randomly until a

hqu_fritz的专栏 605

Sticks POJ - 1011 (暴力dfs+剪枝)

George took sticks of the same length and cut them randomly until all parts became at most 50 units long. Now he wants to return sticks to the original state, but he forgot how many sticks he had origi

退役的铜牌狗 422

最小木棒问题 dfs+ 减枝

Description 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位。然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度。请你设计一个程序,帮助乔治计算木棒的可能最小长度。每一节木棍的长度都用大于零的整数表示。 Input 输入包含多组数据,每组数据包括两行。第一行是一个不超过64的整数,表示砍断之后共有多

zhjhnu的博客 650

poj 1011 sticks(木棒) (dfs+剪枝)

Description 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位。然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度。请你设计一个程序,帮助乔治计算木棒的可能最小长度。每一节木棍的长度都用大于零的整数表示。 Input 输入包含多组数据,每组数据包括两行。第一行是一个不超过64的整数,表示砍断之后

Loi_yuan的博客 1081

POJ - 1011 Sticks(dfs+剪枝)(好题!!)

题目链接:点击查看 题目大意:乔治拿来一组等长的木棍,将他们随机砍断,使得每一节木棍的长度都不超过50个单位长度,然后他又想将这些木棍恢复成砍断之前的状态,但他忘记了初始时有多少根木棍以及木棍的初始长度了,请帮乔治计算一下原木棍的可能最小长度 题目分析:如果只是思路的话很简单,和之前做过的那道小猫下山的题的思路相似,从小到大枚举原始木棍的长度,枚举范围是木棍中的最大值到所有木棍之和,然后每次都...

Falcon的博客 806

poj(1011)——Sticks(经典的dfs+剪枝)

题目的大致意思是: 现在有n根木棍,然后需要把它们拼成同样长度的木棍,问满足这个条件的最短的长度是多少? 想法嘛:那肯定是dfs把长度搜一遍就好,但问题的关键是这里会超时。那么就要用到剪枝的原理了。 以下部分是来自于pku的gw老师说哒 1)不要在同一个位置多次尝试相同长度的木棒(在某一次拼接时选择长度为s的木棒导致拼接失败,则在同一位置尝试下一根木棒时,要跳过所有长度为s的木棒) 2)

ACM_hades的梦想之路 5700

POJ1011-Sticks

全解题报告索引目录 -> 【北大ACM – POJ试题分类】 转载请注明出处:http://exp-blog.com ------------------------------------------------------------------------- 大致题意: 2011 POJ暑假集训题Problem E,POJ上有中文版 解题思路: DFS+剪枝 ...

ζёСяêτ - 小優YoU 1万+

HDU-1427 速算24点

速算24点 Problem Description 速算24点相信绝大多数人都玩过。就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用'+','-','*','/'运算符以及括号改变运算顺序,使得最终运算结果为24(每个数必须且仅能用一次)。游戏很简单,但遇到无解的情况往往让人很郁闷。你的任务就是针对每一组随机产生的四张牌,

枫叶寻寻 1286
上一篇: Snowy Smile (HDU - 6638,稀疏矩阵子矩阵最大和)
下一篇: All men are brothers(2019牛客暑期多校训练营(第九场)E,并查集 + 线段树)
The___Flash
博客等级 码龄8年 79粉丝 223原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值