AcWing-木棍

news2024/11/25 20:47:45

167. 木棒 - AcWing题库

所需知识:dfs,剪枝

思路:首先,将木棍的长度从所有小木棍的最大值开始遍历,遇到的第一个能使所有的小木棍组合成长度相等的大木棍时,则为最优答案,如果想暴力做的话(不考虑剪枝),会超时,所以需要用到剪枝。

剪枝一:因为所有小木棍都要被用来组成大木棍,所以小木棍的总长度一定为大木棍长度的倍数;

剪枝二:将小木棍从大到小排列并组成大木棍使小木棍按顺序排列(以免多种排列,例3 2 1,1 2 3),较大的木棍能占据更大的空间,之后放小木棍的数量就较少一些;遍历的时候直接从小木棍的最大值遍历,因为大木棍不可能由比自己大的木棍组成;

剪枝三:如果一根木棍在第一个位置无解(即此时的len不能使所有小木棍组成n个长度为len的大木棍),则此方案无解;

证明1:

剪枝四:如果一根木棍在最后一个位置无解,则此方案无解;

证明2:与位于首位一样的思路,利用反证法,若最后一个无解,又因为木棍是按照顺序排列的,所以最后一根小木棍,必定放在下一根大木棍的首位,若该方案有解,则两种方案的第i跟木棍可以交换,所以与前提条件矛盾,无解;

剪枝五:若某小木棍放在某位置无解,则与之长度相同的小木棍,也无解,思路同上,利用反证法推导出来矛盾,即可证明该命题不成立;则跳过与i长度相同的木棍;

第一遍看不懂可以多思考几遍,可以自己拿笔在草稿纸上画一画,正所谓“眼看千遍,不如手写一遍”,此题暴力思路并不难,难在剪枝的处理,要将这所有的剪枝一次性想到确实很难,不然很容易TLE;

C++代码:

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
const int N = 70;
int n,sum,len;
bool st[N];
int w[N];

bool dfs(int x,int l,int t){//x表示当前为第几组木棍,l表示当前木棍的长度,st表示当前木棍的序号

    if(x*len==sum) return true;
    if(l==len) return dfs(x+1,0,0);
    
    for (int i = t; i <= n; i ++ ){
        if(st[i]) continue;//若该木棍被使用过则继续用下一个
        if(l+w[i]>len) continue;//若该木棍太长,则继续用下一个
        
        st[i]=true;
        if(dfs(x,l+w[i],t+1)) return true;
        st[i]=false;
        
        //走到这里的时候dfs(x,l+w[i],t+1)为false,则是无解的时候
        if(!l) return false;        //若为第一根则直接返回false
        if(l+w[i]==len)return false;//若为最后一根根则直接返回false
        
        //若存在与第i根相同的木棍,则直接跳过
        int j=i;
        while(j<=n&&w[j]==w[i])j++;
        i=j-1;
    }
    return false;
}
int main()
{
    while(cin>>n,n){//若输入为0,则停止
        //因为有多组数据,要清0
        memset(st,0,sizeof st);
        sum=0;
        len=1;
        for (int i = 1; i <= n; i ++ ){
            cin>>w[i];
            sum+=w[i];
            len=max(len,w[i]);
        }
        sort(w+1,w+1+n);
        reverse(w+1,w+1+n);
        while(1){
            if(sum%len==0&&dfs(0,0,1)){
                cout<<len<<endl;
                break;
            }
            len++;
        }
    }
    return 0;
}

此题还有注意的事项:

1.输入为0停止 

while(cin>>n,n);

2.因为有多组数据,每次记得将数据重新初始化:

memset(st,0,sizeof st);
sum=0;
len=1;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vscode初始化node项目

首先需要安装node环境&#xff0c;推荐直接使用nvm 安装node&#xff0c;方便切换node版本 1.npm init 初始化node项目 在命令行输入npm init指令 根据指令创建完成后会在当前目录下生成一个package.json文件&#xff0c;记住运行npm init执行的目录必须是一个空目录 2.创建…

YOLOv9改进策略 :主干优化 | ConvNeXtV2:适应自监督学习,让 CNN “再一次强大”?

💡💡💡本文改进内容:完全卷积掩码自编码器框架 ConvNeXt V2,它显著提高了纯convnet在各种识别基准上的性能,包括ImageNet分类,COCO目标检测和ADE20k分割。还提供了各种尺寸的预训练ConvNeXt v2模型,从而在ImageNet上具有76.7%精度的3.7M Atto model和88.9%精度的650…

PID算法控制5840-31ZY编码器直流减速电机旋转特定角度(一)

模块分析 在本工程中&#xff0c;使用stm32做主控芯片输出PWM波&#xff0c;TB6112做电源驱动带动5840-31ZY编码器直流减速电机旋转特定角度 有如下模块 TB6112驱动模块 TB6112是性能优于常见L298N的一款电机驱动芯片&#xff0c;体积更小效率更高发热少 其接线如图&#x…

手机真机连接USB调试adb不识别不显示和TCPIP连接问题

手机真机连接USB调试adb devices不显示设备和TCPIP连接 本文手机型号为NOVA 7 &#xff0c;其他型号手机在开发人员模式打开等方式可能略有不同&#xff0c;需根据自己的手机型号修改。 文章目录 1. 打开和关闭开发者模式2. 真机USB连接调试adb不显示设备问题的若干解决方法3…

K8S中部署yaml文件(如Java项目)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

容器安全与防御(德迅蜂巢)

通过容器可以快速的运行应用、迁移应用、快速集成、快速部署、也提高了系统的资源利用率&#xff0c;因此现在越来越多的企业把应用上云&#xff0c;来达到快速上线应用、方便运维的目的。容器安全也逐渐地被重视起来&#xff0c;了解容器如何检测当前企业环境内容器环境是否安…

web练习仿小米页面

效果图&#xff1a; HTML代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document…

绿联 安装PDF工具

这是一个强大的本地托管的基于 Web 的 PDF 操作工具&#xff0c;使用 docker&#xff0c;允许您对 PDF 文件执行各种操作&#xff0c;例如拆分、合并、转换、重组、添加图像、旋转、压缩等。这个本地托管的 Web 应用程序最初是 100% ChatGPT 制作的应用程序&#xff0c;现已发展…

【ENSP】OSPF实现多区域之间的通信

多区域作用&#xff1a;减少路由条目&#xff0c;增加收敛时间 OSPF配置方法 ospf 1 router-id 1.1.1.1 #1为进程号&#xff0c;1.1.1.1唯一标识路由器are 0.0.0.0 #配置区域network 192.168.1.0 0.0.0.25…

专升本-云计算

被誉为第三次信息技术革命 什么是云计算&#xff1f; 云计算是一种商业的计算模式&#xff0c;它将任务分布在大量计算机构成的资源池上&#xff0c;用户可以按需通过网络存储空间&#xff0c;计算能力和信息等服务 云计算的产生和发展&#xff1a; 起源&#xff1a;上世纪6…

牛客NC153 信封嵌套问题【中等 动态规划,最长递增子序列 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/9bf77b5b018d4d24951c9a7edb40408f 相同的题目&#xff1a; https://www.lintcode.com/problem/602 思路 本质是求最长子序列问题envelopes 先按 w 升序排序&#xff0c;再按 h 降序 排序&#xff0c;只需考虑h…

IPv6-地址解析、NUD、DAD、NDP

IPv6-地址解析、NUD&#xff08;邻居不可达检测&#xff09;、DAD&#xff08;重复地址检测&#xff09;&#xff1a; ICMPv6的消息类型&#xff1a; ICMPv6消息回显&#xff0c;type在0~127之间的表示为差错消息&#xff1b;type值在128、129表示信息消息。 1、IPv6地址协议…

HCIP【GRE VPN、MGRE VPN与PPP验证综合实验】

目录 实验要求&#xff1a; 实验拓扑图&#xff1a; 实验思路&#xff1a; 实验步骤&#xff1a; 一、配IP地址 &#xff08;1&#xff09;配置所有设备接口的IP地址&#xff1a; &#xff08;2&#xff09;配置私网与公网接口的缺省路由使得公网可通&#xff1a; 二、P…

ChatGPT如何升级为GPT-4在国内

通过 WildCard 可以把ChatGPT升级为GPT-4 地址 1: 2155 Bailey Hill Rd 城市: Eugene 邮编: 97405 州: Oregon ChatGPT Plus/Team 一键升级&#xff0c;几分钟即可自动升级到 ChatGPT Plus。 选择我的邮箱账号符合要求 复制这个页面的链接即可 复制上面的link 到请在…

SpringCloud实用篇(二)——搭建eureka服务

搭建eureka服务 搭建EurekaServer 注册eureka自己本身 1.创建项目&#xff0c;引入spring-cloud-starter-neflix-eureka-server的依赖 <!--eureka服务端--> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cl…

sectigo 单IP证书360元

IP数字证书使用了强大的加密功能&#xff0c;能够有效保护网站和用户数据在传输过程中的安全。由Sectigo颁发的各种数字证书兼容性高&#xff0c;可以支持几乎所有主流浏览器&#xff0c;在用户访问时不会出现“不安全”提示&#xff0c;Sectigo旗下的IP证书可以为只有公网IP地…

理解游戏服务器架构-逻辑底层架构

目录 前言 什么是逻辑底层架构 逻辑底层架构的职责 1&#xff09;Thread-线程 线程管理 线程通讯 线程安全锁机制 2&#xff09;Network-网络 网络模型 网络消息协议 断线重连 网络安全 防范重复消息 防范篡改消息内容 防范篡改内存数据 网络承载 3&#xff0…

OpenKylin安装Kafka

一、操作系统 openKylin 1.0.1 X86 二、下载安装包 # 安装依赖jdk sudo apt-get update sudo apt-get install default-jdk # 下载kafka mkdir -p /data/software/kafka wget https://archive.apache.org/dist/kafka/2.4.1/kafka_2.13-2.4.1.tgz三、解压安装 # 解压缩Kafka…

【自动装箱以及包装类的缓存】⭐️通过具体案例看下每种包装类的不同结果

目录 前言 一、自动装箱与拆箱&#xff08;以 Integer 包装类为例&#xff09; 二、再来看看几个示例 ​编辑三、Double ,Float 类型亦是如此吗&#xff1f; 前言 小伙伴们大家好&#xff0c;日常使用业务层方面的代码居多&#xff0c;但也不可忘了基本的一些代码格式以及原…

使用Flink实现Kafka到MySQL的数据流转换:一个基于Flink的实践指南

使用Flink实现Kafka到MySQL的数据流转换 在现代数据处理架构中&#xff0c;Kafka和MySQL是两种非常流行的技术。Kafka作为一个高吞吐量的分布式消息系统&#xff0c;常用于构建实时数据流管道。而MySQL则是广泛使用的关系型数据库&#xff0c;适用于存储和查询数据。在某些场景…