2024蓝桥杯每日一题(回溯)

备战2024年蓝桥杯 -- 每日一题
Python大学A组

        试题一:木棒
        试题二:n皇后问题
        试题三:糖果
        试题四:飞机降落
        试题五:生日蛋糕


试题一:木棒

【问题描述】

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

【输入格式】

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

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

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

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

【输出格式】

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

【数据范围】

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

【输入样例】

9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0

【输出样例】

6
5

【解题思路】

【Python程序代码】

x = int(input())
def dfs(u,now,start):if u*l==suma:return Trueif now==l:return dfs(u+1,0,0)i = startwhile i<x:if st[i]:i+=1; continueif a[i]+now>l:i+=1; continuest[i]=Trueif dfs(u,now+a[i],i+1):return Truest[i]=Falseif start==0 or now+a[i]==l:return Falsej = iwhile j<x and a[j]==a[i]:j+=1i = j-1i += 1return False
while x:a = list(map(int,input().split()))suma = sum(a)st = [0]*(70)a.sort(reverse=True)for i in range(len(a)):if a[i]>50:st[i]=1l = 1while 1:if suma%l==0 and dfs(0,0,0):print(l); breakl += 1x = int(input())

试题二: n-皇后问题

【问题描述】

        n−皇后问题是指将 n个皇后放在 n×n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。

         现在给定整数 n,请你输出所有的满足条件的棋子摆法。

【输入格式】

        共一行,包含整数 n。

【输出格式】

        每个解决方案占 n 行,每行输出一个长度为 n 的字符串,用来表示完整的棋盘状态。

        其中 . 表示某一个位置的方格状态为空,Q 表示某一个位置的方格上摆着皇后。

        每个方案输出完成后,输出一个空行。

【数据范围】

        1≤n≤9

【输入样例】

4

【输出样例】

.Q..
...Q
Q...
..Q...Q.
Q...
...Q
.Q..

 【解题思路】

        经典DFS问题,必做题,直接见代码

【Python程序代码】

n = int(input())
r,l,dg,udg = [0]*(n+5),[0]*(n+5),[0]*(2*n+5),[0]*(2*n+5)
st = [[0]*(n+5) for _ in range(n+5)]
def dfs(u):if u==n+1:for i in range(1,n+1):for j in range(1,n+1):if st[i][j]:print('Q',end='')else:print('.',end='')print()print()for i in range(1,n+1):if r[i] or l[u] or dg[i-u+n] or udg[i+u]:continuest[i][u]=1r[i]=l[u]=dg[i-u+n]=udg[i+u]=1dfs(u+1)st[i][u]=0r[i] = l[u] = dg[i - u + n] = udg[i + u] = 0
dfs(1)

试题三:糖果

【题目描述】

        糖果店的老板一共有 M 种口味的糖果出售。为了方便描述,我们将 M 种口味编号 1∼M。小明希望能品尝到所有口味的糖果。遗憾的是老板并不单独出售糖果,而是 K颗一包整包出售。幸好糖果包装上注明了其中 K 颗糖果的口味,所以小明可以在买之前就知道每包内的糖果口味。给定 N 包糖果,请你计算小明最少买几包,就可以品尝到所有口味的糖果。

【输入格式】

        第一行包含三个整数 N,M,K。

        接下来 N 行每行 K 个整数 T1,T2,⋅⋅⋅,TK,代表一包糖果的口味。

【输出格式】

        一个整数表示答案。

        如果小明无法品尝所有口味,输出 −1。

【数据范围】

        1≤N≤100,
        1≤M,K≤20,
        1≤Ti≤M

【输入样例】

6 5 3
1 1 2
1 2 3
1 1 3
2 3 5
5 4 2
5 1 2

【输出样例】

2

 【解题思路】

        可重复覆盖问题,搜索顺序:依次枚举品尝每种糖果(每一列)到底选哪一包糖果(哪一行),看看哪一行有该种类糖果(该列为1表示有该种类糖果)直到把所有的列都覆盖完为止,或者发现有一列无法覆盖也结束,说明无解。
        优化方法:
        1.迭代加深:枚举答案,看看答案是1包能不能覆盖所有类糖,答案是2包能不能覆盖所有类糖…
        2.从少分支的开始枚举
        3.可行性剪枝:添加估价函数h(),至少要选多少行?如果当前剩下的行数<最少的行数,那么肯定无法覆盖。h()的计算:如果某一列没选,就把这一列所有能选的行数都选掉,算作选了1行,这样算出来的行数肯定是<=正确结果的最小行数的。
        4.位运算优化

【Python程序代码】

n,m,k = map(int,input().split())
l2,col = [0]*(1<<m+1),[[] for _ in range(m+5)]
def lowbit(x):return x&-x
def h(state):res = 0i = (1<<m)-1-statewhile i:c = l2[ lowbit(i) ]for r in col[c]:i&=~rres += 1i -= lowbit(i)return res
def dfs(res,state):if res==0 or h(state)>res:return state==(1<<m)-1t = -1i = (1<<m)-1-statewhile i:c = l2[ lowbit(i) ]if t==-1 or len(col[t])>len(col[c]):t = ci -= lowbit(i)for r in col[t]:if dfs(res-1,state|r):return Truereturn False
for i in range(m):l2[1<<i]=i
for i in range(n):tep = list(map(int,input().split()))state = 0for j in range(k):c = tep[j]state |= 1<<(c-1)for j in range(m):if state&(1<<j):col[j].append(state)
res = 1
tep = [[] for _ in range(m+5)]
for i in range(m):tp = set(col[i])tep[i]+=list(tp)
col = tep
while res<=m and dfs(res,0)==False:res+=1
if res>m:res=-1
print(res)

 试题四:飞机降落

【题目描述】

        有 N 架飞机准备降落到某个只有一条跑道的机场。其中第 i架飞机在 Ti 时刻到达机场上空,到达时它的剩余油料还可以继续盘旋 Di 个单位时间,即它最早可以于 Ti 时刻开始降落,最晚可以于 Ti+Di 时刻开始降落。降落过程需要 Li 个单位时间。一架飞机降落完毕时,另一架飞机可以立即在同一时刻开始降落,但是不能在前一架飞机完成降落前开始降落。请你判断 N 架飞机是否可以全部安全降落。

【输入格式】

        输入包含多组数据。

        第一行包含一个整数 T,代表测试数据的组数。

        对于每组数据,第一行包含一个整数 N。

        以下 N 行,每行包含三个整数:Ti,Di 和 Li

【输出格式】

        对于每组数据,输出 YES 或者 NO,代表是否可以全部安全降落。

【数据范围】

        对于 30% 的数据,N≤2。
        对于 100%的数据,1≤T≤10,1≤N≤10,0≤Ti,Di,Li≤100000。

【输入样例】

2
3
0 100 10
10 10 10
0 2 20
3
0 10 20
10 10 20
20 10 20

【输出样例】

YES
NO

【解题思路】

         简单的DFS,考虑所有的排列情况然后判定是否可以全部降落即可。也可以直接进行DFS。

【Python程序代码】

t = int(input())
def dfs(start,u):global flagif u==n:flag = 1returnif flag==1:returnfor i in range(n):if st[i]:continuet,d,l = tdl[i]if t+d>=start:st[i] = 1dfs(max(start,t)+l,u+1)st[i] = 0else:continue
for _ in range(t):n = int(input())tdl = []st = [0]*(20)for i in range(n):tdl.append(list(map(int,input().split())))flag = 0dfs(0,0)if flag:print('YES')else:print('NO')

 试题五:生日蛋糕

【问题描述】

        7 月 17日是 Mr.W 的生日,ACM-THU 为此要制作一个体积为 Nπ 的 M层生日蛋糕,每层都是一个圆柱体。设从下往上数第 i 层蛋糕是半径为 Ri,高度为 Hi的圆柱。当 i<M时,要求 Ri>Ri+1 且 Hi>Hi+1。由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积 Q 最小。令 Q=Sπ,请编程对给出的 N 和 M,找出蛋糕的制作方案(适当的 Ri 和 Hi的值),使 S 最小。除 Q 外,以上所有数据皆为正整数。

【输入格式】

        输入包含两行,第一行为整数 N,表示待制作的蛋糕的体积为 Nπ。

        第二行为整数 M,表示蛋糕的层数为 M。

【输出格式】

        输出仅一行,是一个正整数 S(若无解则 S=0)。

【数据范围】

        1≤N≤10000,
        1≤M≤20

【输入样例】

100
2

【输出样例】

68

【解题思路】

        DFS剪枝的经典问题:
        1.剪枝一:蛋糕由上到下的半径和高度逐渐递减,所以可以初始化一个每层的最小半径和最小高度。
        2.剪枝二:当前摆放的体积若是加上当前能放的最小体积还大于要求体积。说明这个体积不合法(过大),若是已经求出的体积加上我们能够尽可能少的最小侧面积比当前最优解还大,说明该分支一定走不到最优解。
        3.剪枝三:从下往上搜,先枚举大的半径或高度,从小的分枝开始搜索。
        4.剪枝四:s + 2 * (n - v) / R[m + 1] >= ans ,和 s + sqrt(n - v) * 2 >= ans,得分别从计算公式的角度进行放缩剪枝。

【Python程序代码】

n = int(input())
m = int(input())
sumv,sums = [0]*(m+5),[0]*(m+5)
for i in range(1,m+1):sumv[i] += sumv[i-1] + i*i*isums[i] += sums[i-1] + i*i
r,h = [0]*(m+5),[0]*(m+5)
r[m+1]=h[m+1]=1000000000
ans = 1e9
def dfs(u,nv,ns):global ansif u==0:if nv==n:ans = min(ans,ns)returnif nv+sumv[u]>n:returnif ns + sums[u]>=ans:returnif ns + (n-nv)//r[u+1]*2>=ans:returnif ns + 2*(n-nv)**0.5>=ans:returnfor i in range( min(r[u+1]-1, int(((n-nv)//u)**0.5)),u-1,-1):for j in range( min(h[u+1]-1, int((n-nv)/i/i)),u-1,-1):t = 0if u==m:t=i*ir[u]=i; h[u]=jdfs(u-1,nv+i*i*j,ns+2*i*j+t)dfs(m,0,0)
if ans==1e9:print(0)
else:print(ans)

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

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

相关文章

【UE5】非持枪站姿移动混合空间

项目资源文末百度网盘自取 创建角色在非持枪状态且站立移动的动画混合空间 在Character文件夹中创建文件夹&#xff0c;命名为BlendSpace 所有混合空间文件都放到这个文件夹中 在BlendSpace文件夹中单击右键&#xff0c;选择动画(Animation)中的混合空间(BlendSpace) 选择SK…

2、Java虚拟机之类的生命周期-连接(验证、准备、解析)

一、类的生命周期 连接阶段之验证 连接阶段的第一个环节是验证&#xff0c;验证的主要目的是检测Java字节码文件是否遵守了<Java虚拟机规范>中的约束。这个阶段一般是不需要程序员进行处理。 主要包含如下四个部分,具体详见<<Java虚拟机规范>>: 1、文件格…

ClickHouse--13--springboot+mybatis配置clickhouse

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 ClickHouse1.添加maven依赖2.配属数据源3.参数配置4.Druid连接池配置5.entity6.Mapper接口7.Mapper.xml8.controller接口9.创建一个clickhouse表10.测试 ClickHouse…

JavaScript 进阶(四)

一、深浅拷贝 开发中我们经常需要复制一个对象。如果直接用赋值会有下面问题&#xff1a; 1.1 浅拷贝 首先浅拷贝和深拷贝只针对引用类型 。 浅拷贝&#xff1a;拷贝的是地址 。 常见方法&#xff1a; 1. 拷贝对象&#xff1a;Object.assgin() / 展开运算符 {...obj} 拷贝对…

【隐私计算实训营-001数据可信流通,从运维信任到技术信任】

1. 数据可信流通体系 信任的基石&#xff1a; 身份的可确认利益可依赖能力有预期行为有后果 2.内循环——>外循环 内循环&#xff1a;数据持有方在自己的运维安全域内队自己的数据使用和安全拥有全责。 外循环&#xff1a;数据要素在离开持有方安全域后&#xff0c;持有方…

阅读笔记(CVPR2020)Warping Residual Based Image Stitching for Large Parallax

基于变形残差的大视差图像拼接 K. -Y. Lee and J. -Y. Sim, "Warping Residual Based Image Stitching for Large Parallax," 2020 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), Seattle, WA, USA, 2020, pp. 8195-8203, doi: 10.1109/…

CSS学习2

自己在工作中总是有一些自动化开发的需求&#xff0c;总是以为自己是有前端基础的&#xff0c;但是一写页面&#xff0c;布局都布不好&#xff0c;真是搞笑&#xff0c;说起来还是基本功不扎实啊&#xff0c;这里在重新复习一下&#xff0c;然后记录一下文档。后边在写两个综合…

【linux】环境变量(进程二)

这里写目录标题 命令行参数&#xff1a;环境变量&#xff1a; 命令行参数&#xff1a; 不谈命令行参数就谈环境变量就是耍流氓。 相信我们在C语言阶段都在main函数里见过参数。 例如int main(int argc, char* argv[]) 这是什么东西呢&#xff1f; 话不多说我们直接打印一下看…

JupyterNotebook 如何切换使用的虚拟环境kernel

在Jupyter Notebook中&#xff0c;如果需要修改使用的虚拟环境Kernel&#xff1a; 首先&#xff0c;需要确保虚拟环境已经安装conda上【conda基本操作】 打开Jupyter Notebook。 在Jupyter Notebook的顶部菜单中&#xff0c;选择 “New” 在弹出的窗口中&#xff0c;列出了…

“JavaScript: void(0)的替代方案有哪些?”

学习目标&#xff1a; 理解javascript:void(0)的工作原理&#xff0c;以及它在前端开发中的作用和用途。掌握javascript:void(0)的正确用法&#xff0c;包括在HTML中使用和在事件处理程序中使用。能够识别javascript:void(0)可能引起的常见问题&#xff0c;并学会相应的解决方…

numpy的数组深度叠加dstack详解

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、引言 numpy的dstack函数用于沿着第三个维度&#xff08;深度&#xff09;将数组堆叠起来。它将多个数组按照深度方向进行堆叠&#xff0c;生成一个新的数组。具体来说&#xff0c;dstack函数会将输入的…

docker部署开源多功能监控系统

HertzBeat 是一个无需 Agent、高性能、易扩展、功能强大的开源实时监控告警系统&#xff0c;无需 Agent、高性能、易扩展、功能强大&#xff0c;由 Dromara 团队开发并开源&#xff0c;能够帮我们轻松监控应用、服务、基础设施等各种资源的运行状况 部署 docker run -d -p 11…

腾讯云服务器按月收费价格表,优惠价格5元一个月起

2024腾讯云服务器多少钱一个月&#xff1f;5元1个月起&#xff0c;腾讯云轻量服务器4核16G12M带宽32元1个月、96元3个月&#xff0c;8核32G22M配置115元一个月、345元3个月&#xff0c;腾讯云轻量应用服务器61元一年折合5元一个月、4核8G12M配置646元15个月、2核4G5M服务器165元…

01 JDBC介绍

文章目录 JDBC本质版本使用核心APIDriverDriverManager驱动注册连接对象获取 Connection获取执行对象事务管理 Statement概述 ResultSet概述 JDBC本质 官方&#xff08;sun公司&#xff09;定义的一套操作所有关系型数据库的规则&#xff0c;即接口各个数据库厂商去实现这套接…

【Week Y2】使用自己的数据集训练YOLO-v5s

Y2-使用自己的数据集训练YOLO-v5s 零、遇到的问题汇总&#xff08;1&#xff09;遇到git的import error&#xff08;2&#xff09;Error&#xff1a;Dataset not found&#xff08;3&#xff09;Error&#xff1a;删除中文后&#xff0c;训练图片路径不存在 一、.xml文件里保存…

框架篇常见面试题

1、Spring框架的单例bean是线程安全的吗&#xff1f; 2、什么是AOP&#xff1f; 3、Spring的事务是如何实现的&#xff1f; 4、Spring事务失效的场景 5、SpringBean的声明周期 6、Spring的循环依赖 7、SpringMVC的执行流程 8、SpringBoot自动配置原理 9、Spring常见注解

Java中的实用类讲解(中篇)

如果想观看更多Java内容 可上我的个人主页关注我&#xff0c;地址子逸爱编程-CSDN博客https://blog.csdn.net/a15766649633?spm1000.2115.3001.5343 使用工具 IntelliJ IDEA Community Edition 2023.1.4 使用语言 Java8 代码能力快速提升小方法&#xff0c;看完代码自己敲…

AV1:帧内预测(一)

​VP9支持10种帧内预测模式&#xff0c;包括8种角度模式和非角度模式DC、TM(True Motion)模式&#xff0c;AV1在其基础上进一步扩展&#xff0c;AV1帧内预测角度模式更细化&#xff0c;同时新增了部分非角度模式。 扩展的角度模式 AV1在VP9角度模式的基础上进一步扩展&#xf…

CSharp的lambda表达式匿名类扩展方法

c#的lamba表达式 之前已经写过一些关于委托还有事件的文章&#xff0c;今天就来介绍一下lambda表达式。 首先定义需要的函数以及委托 { public delegate void DoNothingDelegate(); public delegate void StudyDelegate(int id, string name);private void DoNothing() {Cons…

蓝桥杯--完全二叉树

import java.util.Scanner;import static java.lang.Math.log;public class top9 {//求树的每一层的和public static void main(String [] args){Scanner scannernew Scanner(System.in);int nscanner.nextInt();int [] arrnew int[n];for(int i0;i<n;i){arr[i]scanner.next…