Acwing.167 木棒(回溯)

题目

乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过 50
个长度单位。

然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度。

请你设计一个程序,帮助乔治计算木棒的可能最小长度。

每一节木棍的长度都用大于零的整数表示。

输入格式

输入包含多组数据,每组数据包括两行。

第一行是一个不超过 64的整数,表示砍断之后共有多少节木棍。

第二行是截断以后,所得到的各节木棍的长度。

在最后一组数据之后,是一个零。

输出格式

为每组数据,分别输出原始木棒的可能最小长度,每组数据占一行。

数据范围

数据保证每一节木棍的长度均不大于 50。

  • 输入样例:
9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0
  • 输出样例:
6
5

题解

import java.io.*;
import java.util.*;

/**
 * @author akuya
 * @create 2024-03-20-15:08
 */
public class Main {
    static int N=65;
    static int n;
    //木棍长度
    static int[] w=new int[N];
    //去重
    static boolean[] st=new boolean[N];
    //木棍总长与木棍的最大长度
    static int sum,len;
    public static void main(String[] args) throws Exception {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        PrintWriter pw=new PrintWriter(new OutputStreamWriter(System.out));
        while(true){
            n=Integer.parseInt(br.readLine());
            if(n==0){
                break;
            }
            sum=len=0;
            String t[]=br.readLine().split(" ");
            for(int i=0;i<n;i++){
                w[i]=Integer.parseInt(t[i]);
                sum+=w[i];
                len=Math.max(len,w[i]);
            }

			//第一次裁枝,先从长木棍开始选
            Arrays.sort(w,0,n);
            for(int i=0;i<n/2;i++){
                int temp=w[i];
                w[i]=w[n-i-1];
                w[n-i-1]=temp;
            }
		
            Arrays.fill(st,0,n,false);
            while (true) {
            //第二次剪,筛选因数
                if(sum%len==0&&dfs(0,0,0)){
                    pw.println(len);
                    break;
                }
                len++;
            }

        }
        br.close();
        pw.flush();
        pw.close();

    }
    public static boolean dfs(int u,int cur,int start){
        if(u*len==sum) return true;
        if(cur ==len) return  dfs(u+1,0,0);

        for(int i=start;i<n;i++){
            if(st[i]) continue;
            if(cur+w[i]<=len){
                st[i]=true;
                if(dfs(u,cur+w[i],i+1)) return true;
                st[i] =false;
            }


			//第三次减枝第一步
            if(cur==0 || cur+w[i]==len) return false;

			//第二步当前长度失败,则跳过所有单签长度
            int j=i+1;
            while(j<n&&w[i]==w[j])j++;
            i=j-1;
        }
        return false;
    }
}

思路

这道题是有一较有难度的暴力搜索,看似代码短而简单,少减一条枝干直接TLE。具体剪枝分为三步。
第一步,让数值逆序排序,先排长数值,会让深搜更快达到裁枝标准,从而降低深搜深度。
第二步,只搜索总长的因数,这个好理解。
第三步分为三个部分
1.如果当前使用当前树枝得到的结果是最后无法达成目标,那么所有的该长度树枝都在这一步跳过。
2.每个第一次用的树枝,在作为拼凑木棍的第一根树枝时,该情况下如果最后无法达成目标,则该长度的分组无论如何无法成立,直接返回false。
3.每个第一次用的树枝,在作为拼凑木棍的最后根树枝时,该情况下如果最后无法达成目标,则该长度的分组无论如何无法成立,直接返回false。

满足以上三步裁枝才能不TLE,以上裁枝都可以用数学数学证明,这里就不说证明了。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/474286.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

年度告警分类统计

1、打开前端Vue项目kongguan_web&#xff0c;完成前端src/components/echart/YearWarningChart.vue页面设计 在YearWarningChart.vue页面添加div设计 <template><div class"home"><div style"margin: 0px auto;height: 100%"><div …

金蝶云星空——单据附件上传

文章目录 概要技术要点代码实现小结 概要 单据附件上传 技术要点 单据附件上传金蝶是有提供标准的上传接口&#xff1a; http://[IP]/K3Cloud/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.AttachmentUpLoad.common.kdsvc 参数说明 参数类型必填说明FileName字符是…

基于springboot+vue的乡村民宿管理系统

一、系统架构 前端&#xff1a;vue | element-ui 后端&#xff1a;springboot | mybatis-plus 环境&#xff1a;jdk1.8 | mysql | maven | nodejs 二、代码及数据库 三、功能介绍 01. 登录页 02. 注册 03. 管理员-首页 04. 管理员-信息管理-公告信息 05. 管理员…

淘宝|天猫|京东|1688主流电商平台的实时数据返回接口|附Python实例

导读&#xff1a;随着淘宝/天猫直通车功能升级&#xff0c;很多功能越来越白盒化&#xff0c;越来越简化&#xff0c;更方便用户的操作&#xff0c;只需一键即可看出淘宝/天猫直通车存在的问题。淘宝/天猫直通车千人千面后有了实时数据工具&#xff0c;下面通过一个案例告诉大家…

【Android】【Bluetooth Stack】蓝牙电话本协议之同步通话记录分析(超详细)

1. 精讲蓝牙协议栈&#xff08;Bluetooth Stack&#xff09;&#xff1a;SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OPP/PAN/GATTC/GATTS/HOGP等协议理论 2. 欢迎大家关注和订阅&#xff0c;【蓝牙协议栈】专栏会持续更新中.....敬请期待&#xff01; 目录 1. 协议简述 1.1 PBAP…

Day02-DDLDMLDQL(定义,操作,查询)(联合查询,子查询,字符集和校对集,MySQL5.7乱码问题)

文章目录 Day02-DDL&DML和DQL学习目标1. SQL语言的组成2. DDL2.1 数据库结构2.2 表结构2.3 约束2.3.1 主键约束(重要)(1)特点(2) 添加主键(3)删除主键(了解) 2.3.2 自增约束(1)特点(2) 添加自增约束(3)删除自增约束(了解) 2.3.3 非空约束(1)添加非空约束(2) 删除非空约束 2…

day01_mysql数据类型和运算符_课后练习 - 参考答案

文章目录 day01_mysql_课后练习第1题第2题第3题第4题第5题 day01_mysql_课后练习 第1题 案例&#xff1a; 1、创建数据库day01_test01_library 2、创建表格books 字段名字段说明数据类型允许为空唯一b_id书编号int(11)否是b_name书名varchar&#xff08;50&#xff09;否否…

OLAP数据库选型指南:Doris与ClickHouse的深入对比与分析

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 在当今数据驱动的时代&#xff0c;数据的存储、处理和分析变得尤为重要。为了满足这一需求&#xff0c;市场上涌现出了许多优秀的…

FPGA Vivado环境下实现D触发器

题目要求&#xff1a;使用Verilog HDL语言设计一个D触发器。请提交程序源代码和Word格式的作业文档&#xff0c;作业文档中应给出程序源代码及RTL分析原理图。 D触发器的工作原理&#xff1a; 初始状态下&#xff0c;触发器处于复位状态&#xff0c;输出为复位信号的稳定状态…

Linux笔试题

1. 程序代码如下&#xff0c;请按执行顺序写出输出结果: int main() { pid_t pid1,pid2;if((pid1fork()) 0) {sleep(3);printf(“info1 from child process_1\n”);exit(0);printf(“info2 from child process_1\n”); } else {if((pid2fork()) 0){sleep(1);printf(“i…

排序算法:快速排序(非递归)

文章目录 一、先建立一个栈二、代码编写 !](https://img-blog.csdnimg.cn/direct/870dd101173d4522862e4459b32237a3.png) 先赞后看&#xff0c;养成习惯&#xff01;&#xff01;&#xff01;^ _ ^<3 ❤️ ❤️ ❤️ 码字不易&#xff0c;大家的支持就是我坚持下去的动力…

力扣刷题-砖墙题554

砖墙题 这题一开始没有想到思路&#xff0c;一开始还想着用枚举法做/笑哭 后来看了题解&#xff0c;原来就是哈希表的题目呀。 说到哈希表&#xff0c;这里有个八股需要记一下&#xff1a; HashMap和HashTable的区别 线程是否安全&#xff1a;HashMap线程不安全 HashTable线…

[综述笔记]Flexible large-scale fMRI analysis: A survey

论文网址&#xff1a;Flexible large-scale fMRI analysis: A survey | IEEE Conference Publication | IEEE Xplore 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff0…

力扣热门算法题 56. 合并区间,57. 插入区间,58. 最后一个单词的长度v

56. 合并区间&#xff0c;57. 插入区间&#xff0c;58. 最后一个单词的长度&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.20 可通过leetcode所有测试用例。 目录 56. 合并区间 解题思路 完整代码 Python Java ​编辑 5…

【自然语言处理】NLP入门(八):1、正则表达式与Python中的实现(8):正则表达式元字符:.、[]、^、$、*、+、?、{m,n}

文章目录 一、前言二、正则表达式与Python中的实现1、字符串构造2、字符串截取3、字符串格式化输出4、字符转义符5、字符串常用函数6、字符串常用方法7、正则表达式1. .&#xff1a;表示除换行符以外的任意字符2. []&#xff1a;指定字符集3. ^ &#xff1a;匹配行首&#xff0…

Linux中,运行程序,顺便将打印信息存储在Log文件中查看

前言 如题&#xff0c;原本打算在代码中自己写一个类去管理将打印信息收集到log日志中&#xff0c;忽然想到&#xff0c;其实也可以写sh脚本 简单demo1 #!/bin/bash# 启动应用程序 test&#xff0c;并将标准输出和标准错误输出都追加到 log 文件中 ./test >> output.log…

基于Java中的SSM框架实现高校毕业设计管理系统项目【项目源码+论文说明】计算机毕业设计

基于Java中的SSM框架实现高校毕业设计管理系统演示 摘要 现代学校的教学规模逐渐增加&#xff0c;需要处理的信息量也在增加。每年毕业&#xff0c;将会有大量的毕业设计要处理。传统的毕业设计管理方法已不能满足师生的需求。教师和学生需要一个简单方便的系统来取代传统的机…

FPGA学习_Xilinx7系列FPGA基本结构

文章目录 前言一、7系列FPGA介绍1.1、芯片编号 二、基本组成单元2.1、可编程逻辑块CLB&#xff08;Configable Logic Block&#xff09;2.2、可编程输入输出单元&#xff08;IOB&#xff09;2.3、嵌入式块RAM&#xff08;Block RAM&#xff09;2.4、底层内嵌功能单元2.5、内嵌专…

【2】华为交换机如何修改Web登录密码?

0x01 问题描述 如果忘记了Web登录密码或者希望修改Web登录密码&#xff0c;用户可以通过Console口、STelnet或Tenet等方式登录交换机后设置新的Web登录密码。 使用Telnet协议存在安全风险&#xff0c;建议使用Console囗或STelnet V2登录设备 0x02 问题解决 <HUAWEI> s…

Linux信号补充——信号发送和保存

三、信号的发送与保存 3.1信号的发送 ​ 必须有操作系统来保存信号&#xff0c;因为他是管理者&#xff1b; ​ 信号给进程的task_struct发送信号&#xff0c;在task_struct中维护了一个整数signal有0-31位&#xff0c;共32个bit位&#xff1b;对于信号的管理使用的是位图结…