P1120 小木棍(搜索+剪枝)
题目链接:P1120 小木棍 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
样例输入:
9
5 2 1 5 2 1 5 2 1
样例输出:
6
分析:这道题一看数据范围就知道是搜索,但关键是需要剪枝。
首先我们求出所有木棍的长度和,那么原始木棍的长度一定是长度和的因子,这是显然的,然后我们就开始对每个因子进行从小到大搜索。
根据贪心性质我们可以知道优先选用长的木棍进行组装,因为短的木棍在任何情况下都可以替换等长的长的木棍,但是长的木棍在有些情况下无法替换短的木棍,所以我们首先要对木棍进行从大到小排序。
先来看一下搜索函数的参数,假如我们要枚举的长度是len,首先需要知道当前长度为len的木棍还差多少,也就是res,然后还需要知道组成当前木棍的上一节子棍的长度last,因为我们枚举的子棍是逐渐减少的,所以这个可以用于剪枝,最后一个就是当前我们还差几根长度为len的木棍就可以完整拼完了。
下面来分析一下哪些地方可以剪枝:
1.如果我们一开始拼一节长度为len的木棍,这个时候还没有放上去小木棍,那么这个时候我们就放上去还未使用过的长度最长的木棍。因为所有木棍最后都一定要用上的
2.我们可以用nx[i]标记下一个与第i根木棍长度不一致的编号,假如我们当前用第i根木棍没有拼接成功,那么如果下一根木棍跟当前木棍长度一样,那么我们也就没有必要用下一根木棍了,直接选用下一个跟当前木棍长度不一致的木棍即可
3.我们记录了组装当前木棍的剩余长度res和组成当前木棍的上一个子木棍last,那么我们下一根木棍的长度一定是小于等于两者的较小值的,查询第一个小于等于两者较小值的木棍我们可以用二分来查找
4.根据第一条剪枝我们可以知道,假如当前木棍还没有开始拼,我们优先选择未使用过且最长的木棍来进行拼接,但是如果拼接失败,那么我们没必要用更小的木棍去尝试拼接,直接返回false即可,如果要是剩余的长度等于当前木棍的长度而且还未拼接成功这就代表着我们在组装当前木棍时选取最合适子木棍依旧无法拼接成功,那么这个时候我们也是直接返回false即可。
加上上面四个剪枝就可以ac了
细节见代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
const int N=100;
int a[N],len;
bool vis[N];
int nx[N];
bool cmp(int a,int b)
{return a>b;
}
int n;
bool dfs(int res,int last,int cnt)//res记录当前这根木棍还剩的拼接长度,last记录拼接当前木棍的上一个木棍的长度,cnt记录还剩多少个木棍
{if(res==0){if(cnt==1) return true;for(int i=2;i<=n;i++)//选择第一个没有被使用的木棍进行拼接 {if(vis[i]) continue;vis[i]=true;if(dfs(len-a[i],a[i],cnt-1)) return true;vis[i]=false;break;}}int l=1,r=n;int t=min(last,res);while(l<r)//二分找第一个可以填的位置,下一个子棍的长度一定小于等于上一根拼接该木棍的子棍长度 {int mid=l+r>>1;if(a[mid]<=t) r=mid;else l=mid+1;} for(int i=l;i<=n;i++){if(vis[i]) continue;vis[i]=true;bool flag=dfs(res-a[i],a[i],cnt);vis[i]=false;if(flag) return true;//有一个可以了就可以退出了 if(res==a[i]||res==len) return false; i=nx[i]-1;//用第i根木棍没有拼接成功 }return false;
}
int main()
{cin>>n;int sum=0;for(int i=1;i<=n;i++){scanf("%d",&a[i]);sum+=a[i];}sort(a+1,a+n+1,cmp);nx[n]=n+1;for(int i=n-1;i>=1;i--){if(a[i]==a[i+1]) nx[i]=nx[i+1];else nx[i]=i+1;}int ans=sum;for(len=a[1];len<=sum/2;len++)//枚举原始木棍长度{if(sum%len) continue;vis[1]=true;if(dfs(len-a[1],a[1],sum/len)){ans=len;break;}}printf("%d",ans);return 0;
}
相关文章:
P1120 小木棍(搜索+剪枝)
题目链接:P1120 小木棍 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 样例输入: 9 5 2 1 5 2 1 5 2 1 样例输出: 6 分析:这道题一看数据范围就知道是搜索,但关键是需要剪枝。 首先我们求出所有木棍的长度和&am…...
【专项训练】动态规划-3
动态规划:状态转移方程、找重复性和最优子结构 分治 + 记忆化搜索,可以过度到动态规划(动态递推) function DP():# DP状态定义# 需要经验,需把现实问题定义为一个数组,一维、二维、三维……dp =[][] # 二维情况for i = 0...M:...
【Linux】信号+再谈进程地址空间
目录 一、Linux中的信号 1、Linux中的信号 2、进程对信号的处理 3、信号的释义 二、信号的捕捉 1、信号的捕捉signal() 2、信号的捕捉sigaction() 三、信号如何产生? 1、kill()用户调用kill向操作系统发送信号 通过命令行参数模仿写一个kill命令 2、rais…...
C++回顾(二十一)—— list容器
21.1 list概述 list是一个双向链表容器,可高效地进行插入删除元素。list不可以随机存取元素,所以不支持at.(pos)函数与[]操作符。It(ok) it5(err)需要添加头文件:#include <list> 21.2 list构造 (1)默认构造…...
爱国者一体机电脑蓝屏怎么U盘重装系统教学?
爱国者一体机电脑蓝屏怎么U盘重装系统教学?有用户使用的爱国者一体机电脑开机了之后突然变成了蓝屏的了。而且无法继续使用了,那么遇到这样的蓝屏问题怎么去进行系统的重装呢?一起来看看以下的U盘重装系统教学吧。 准备工作: 1、U…...
Vue学习笔记(9)
9.1 axios 9.1.1 概述 Axios是一个流行的基于Promise的HTTP客户端,用于在浏览器和Node中发送HTTP请求。它可以用于处理各种请求类型,例如GET,POST等。Axios可以很容易地与现代前端框架和库集成,例如React,Vue等。 A…...
中值滤波+Matlab仿真+频域响应分析
中值滤波 文章目录中值滤波理解中值滤波的过程Matlab 实现实际应用频域分析中值滤波是一种滤波算法,其目的是去除信号中的噪声,而不会对信号本身造成太大的影响。它的原理非常简单:对于一个给定的窗口大小,将窗口内的数值排序&…...
自然语言处理中数据增强(Data Augmentation)技术最全盘点
与“计算机视觉”中使用图像数据增强的标准做法不同,在NLP中,文本数据的增强非常少见。这是因为对图像的琐碎操作(例如将图像旋转几度或将其转换为灰度)不会改变其语义。语义上不变的转换的存在是使增强成为Computer Vision研究中…...
PINN解偏微分方程实例1
PINN解偏微分方程实例11. PINN简介2. 偏微分方程实例3. 基于pytorch实现代码4. 数值解参考资料1. PINN简介 PINN是一种利用神经网络求解偏微分方程的方法,其计算流程图如下图所示,这里以偏微分方程(1)为例。 ∂u∂tu∂u∂xv∂2u∂x2\begin{align} \frac{…...
【python 基础篇 十二】python的函数-------函数生成器
目录1.生成器基本概念2.生成器的创建方式3.生成器的输出方式4.send()方法5.关闭生成器6.注意事项1.生成器基本概念 是一个特色的迭代器(迭代器的抽象层级更高)所以拥有迭代器的特性 惰性计算数据 节省内存 ----就是不是立马生成所有数据,而是…...
elasticsearch全解 (待续)
目录elasticsearchELK技术栈Lucene与Elasticsearch关系为什么不是其他搜索技术?Elasticsearch核心概念Cluster:集群Node:节点Shard:分片Replia:副本全文检索倒排索引正向和倒排es的一些概念文档和字段索引和映射mysql与…...
springboot2集成knife4j
springboot2集成knife4j springboot2集成knife4j 环境说明集成knife4j 第一步:引入依赖第二步:编写配置类第三步:测试一下 第一小步:编写controller第二小步:启动项目,访问api文档 相关资料 环境说明 …...
Qt 性能优化:CPU占有率高的现象和解决办法
一、前言 在最近的项目中,发现执行 Qt 程序时,有些情况下的 CPU 占用率奇高,最高高达 100%。项目跑在嵌入式板子上,最开始使用 EGLFS 插件,但是由于板子没有单独的鼠标层,导致鼠标移动起来卡顿,…...
MySQL专题(学会就毕业)
MySQL专题0.准备sql设计一张员工信息表,要求如下:编号(纯数字)员工工号 (字符串类型,长度不超过10位)员工姓名(字符串类型,长度不超过10位)性别(男/女,存储一…...
Java高级技术:单元测试、反射、注解
目录 单元测试 单元测试概述 单元测试快速入门 单元测试常用注解 反射 反射概述 反射获取类对象 反射获取构造器对象 反射获取成员变量对象 反射获取方法对象 反射的作用-绕过编译阶段为集合添加数据 反射的作用-通用框架的底层原理 注解 注解概述 自定义注解 …...
C语言初识
#include <stdio.h>//这种写法是过时的写法 void main() {}//int是整型的意思 //main前面的int表示main函数调用后返回一个整型值 int main() {return 0; }int main() { //主函数--程序的入口--main函数有且仅有一个//在这里完成任务//在屏幕伤输出hello world//函数-pri…...
Cadence Allegro 导出Etch Length by Layer Report报告详解
⏪《上一篇》 🏡《上级目录》 ⏩《下一篇》 目录 1,概述2,Etch Length by Layer Report作用3,Etch Length by Layer Report示例4,Etch Length by Layer Report导出方法4.2,方法14.2,方法2B站关注“硬小二”浏览更多演示视频...
无监督对比学习(CL)最新必读经典论文整理分享
对比自监督学习技术是一种很有前途的方法,它通过学习对使两种事物相似或不同的东西进行编码来构建表示。Contrastive learning有很多文章介绍,区别于生成式的自监督方法,如AutoEncoder通过重建输入信号获取中间表示,Contrastive M…...
最长回文子串【Java实现】
题目描述 现有一个字符串s,求s的最长回文子串的长度 输入描述 一个字符串s,仅由小写字母组成,长度不超过100 输出描述 输出一个整数,表示最长回文子串的长度 样例 输入 lozjujzve输出 // 最长公共子串为zjujz,长度为…...
LeetCode 438. Find All Anagrams in a String
LeetCode 438. Find All Anagrams in a String 题目描述 Given two strings s and p, return an array of all the start indices of p’s anagrams in s. You may return the answer in any order. An Anagram is a word or phrase formed by rearranging the letters of a…...
MyBatis-1:基础概念+环境配置
什么是MyBatis?MyBatis是一款优秀的持久层框架,支持自定义sql,存储过程以及高级映射。MyBatis就是可以让我们更加简单的实现程序和数据库之间进行交互的一个工具。可以让我们更加简单的操作和读取数据库的内容。MyBatis的官网:htt…...
R语言基础(五):流程控制语句
R语言基础(一):注释、变量 R语言基础(二):常用函数 R语言基础(三):运算 R语言基础(四):数据类型 6.流程控制语句 和大多数编程语言一样,R语言支持选择结构和循环结构。 6.1 选择语句 选择语句是当条件满足的时候才执行…...
【Java开发】设计模式 02:工厂模式
1 工厂模式介绍工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使…...
合并两个链表(自定义位置合并与有序合并)LeetCode--OJ题详解
图片: csdn 自定义位置合并 问题: 给两个链表 list1 和 list2 ,它们包含的元素分别为 n 个和 m 个。 请你将 list1 中 下标从 a 到 b 的全部节点都删除,并将list2 接在被删除节点 的位置。 比如: 输入:list1 [1…...
Java编程问题总结
Java编程问题总结 整理自 https://github.com/giantray/stackoverflow-java-top-qa 基础语法 将InputStream转换为String apache commons-io String content IOUtils.toString(new FileInputStream(file), StandardCharsets.UTF_8); //String value FileUtils.readFileT…...
binutils工具集——objcopy的用法
以下内容源于网络资源的学习与整理,如有侵权请告知删除。 一、工具简介 objcopy主要用来转换目标文件的格式。 在实际开发中,我们会用该工具进行格式转换与内容删除。 (1)在链接完成后,将elf格式的.out文件转化为bi…...
Windows使用Stable Diffusion时遇到的各种问题和知识点整理(更新中...)
Stable Diffusion安装完成后,在使用过程中会出现卡死、文件不存在等问题,在本文中将把遇到的问题陆续记录下来,有兴趣的朋友可以参考。 如果要了解如何安装sd,则参考本文《Windows安装Stable Diffusion WebUI及问题解决记录》。如…...
MySQL workbench基本查询语句
1.查询所有字段所有记录 SELECT * FROM world.city; select 表示查询;“*” 称为通配符,也称为“标配符”。表示将表中所有的字段都查询出来;from 表示从哪里查询;world.city 表示名为world的数据库中的city表; 上面…...
软件测试详解
文章目录一、软件危机(一)概念(二)产生软件危机的原因(三)消除软件危机的途径二、软件过程模型(一)软件生命周期概念(二)软件开发模型1. 瀑布模型2. 螺旋模型…...
YOLOS学习记录
在前面,博主已经完成了YOLOS项目的部署与调试任务,并在博主自己构造的数据集上进行了实验,实验结果表明效果并不显著,其实这一点并不意外,反而是在情理之中。众所周知,Transformer一直以来作为NLP领域的带头…...
电子商务网站的运营一般需要做哪些准备/短视频排名seo
摘要: 用数据说话,这是当前很流行的话题,本文将数据管理过程划分成4个层次,并阐述企业如何达到这四个层次。 1.初级量化管理:以数据“感知”项目的状况(相当于CMMI2级) 2.中级量化管理ÿ…...
我国政府门户网站建设现状/手机百度网盘登录入口
<?php /*** Filefifo.php 文件型FIFO队列*/ class Filefifo {/*** $_file_data, 数据文件的路径 */private $_file_data ;/*** $_file_idx, 索引文件的路径*/private $_file_idx ;/*** $_file_idx_bak, 索引备份文件的路径, 防止意外断电等导致索引文件破坏*/private $_f…...
怎么把网站挂在服务器/自媒体营销模式有哪些
你的电脑桌面看上去是不是这个样子?如果你有下面几个“坏习惯”,电脑里的文件不乱才怪:文件层级太深:比如说一个销售数据excel文件存放在“D盘-2017年-大灵通项目-西大街门店-月报表”,这个目录下,看上去一…...
wordpress权限设置管理员/制作网站的软件
PDF文件转换成其他格式文件,需要用到PDF转换器,我们以奥凯丰 PDF转换大师为例,了解PDF转换格式工具。 【PDF转换大师】转为word_excel_ppt_txt_jpg等格式-奥凯丰okfonePDF转换大师是奥凯丰推出的一款可以把pdf文件格式转换成word,…...
长沙专业的网站建设企业/百度app免费下载安装最新版
Java常用类型定义、转换及比较主要有以下三个方面: (一)Integer类型 1).定义 Integer anew Integer(int value); Integer anew Integer(String value); 2).转换 i.定义中就可以将int型和String型的转换为Integer型 ii. String类型转换为Integer型 Integer.vJava常用…...
wordpress调用时间/一个品牌的策划方案
一、lseek lseek函数的作用是用来重新定位文件读写的位移。 头文件以及函数声明 #include <sys/types.h> #include <unistd.h> off_t lseek(int fd, off_t offset, int whence); lseek()函数会重新定位被打开文件的位移量,根据参数offset以及whence的组…...