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

news2025/2/24 21:30:29

备战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 True
    if now==l:return dfs(u+1,0,0)
    i = start
    while i<x:
        if st[i]:i+=1; continue
        if a[i]+now>l:i+=1; continue
        st[i]=True
        if dfs(u,now+a[i],i+1):return True
        st[i]=False
        if start==0 or now+a[i]==l:return False
        j = i
        while j<x and a[j]==a[i]:j+=1
        i = j-1
        i += 1
    return 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]=1
    l = 1
    while 1:
        if suma%l==0 and dfs(0,0,0):
            print(l); break
        l += 1
    x = 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]:continue
        st[i][u]=1
        r[i]=l[u]=dg[i-u+n]=udg[i+u]=1
        dfs(u+1)
        st[i][u]=0
        r[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 = 0
    i = (1<<m)-1-state
    while i:
        c = l2[ lowbit(i) ]
        for r in col[c]:
            i&=~r
        res += 1
        i -= lowbit(i)
    return res
def dfs(res,state):
    if res==0 or h(state)>res:return state==(1<<m)-1
    t = -1
    i = (1<<m)-1-state
    while i:
        c = l2[ lowbit(i) ]
        if t==-1 or len(col[t])>len(col[c]):
            t = c
        i -= lowbit(i)
    for r in col[t]:
        if dfs(res-1,state|r):return True
    return False
for i in range(m):l2[1<<i]=i
for i in range(n):
    tep = list(map(int,input().split()))
    state = 0
    for 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 flag
    if u==n:
        flag = 1
        return
    if flag==1:return
    for i in range(n):
        if st[i]:continue
        t,d,l = tdl[i]
        if t+d>=start:
            st[i] = 1
            dfs(max(start,t)+l,u+1)
            st[i] = 0
        else: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 = 0
    dfs(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*i
    sums[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 ans
    if u==0:
        if nv==n:ans = min(ans,ns)
        return
    if nv+sumv[u]>n:return
    if ns + sums[u]>=ans:return
    if ns + (n-nv)//r[u+1]*2>=ans:return
    if ns + 2*(n-nv)**0.5>=ans:return
    for 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 = 0
            if u==m:t=i*i
            r[u]=i; h[u]=j
            dfs(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.coloradmin.cn/o/1529092.html

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

相关文章

【工具】Mermaid + 大模型画流程图

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 引入使用画TCP三次握手了解历史人物 总结 引入 最近看面试文章关于TCP三次握手和…

PTA L2-021 点赞狂魔

微博上有个“点赞”功能&#xff0c;你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签&#xff0c;而你点赞的博文的类型&#xff0c;也间接刻画了你的特性。然而有这么一种人&#xff0c;他们会通过给自己看到的一切内容点赞来狂刷存在感&#xff0c;这…

好委屈,东方甄选为何总是被供应商骗?

东方甄选最近很委屈。 315晚会过后&#xff0c;知名打假人王海爆料&#xff0c;称315晚会曝光的槽头肉扣肉在东方甄选和小杨哥的直播间里销售过。 东方甄选赶忙去问了问供应商情况。 供应商的回答让他感到暖心&#xff0c;表示虽然315晚会曝光了我们公司违规使用糟头肉&…

Pulsar IO实战

一、引言 今天跟着 官方文档 基于docker玩一把Pulsar IO吧 二、概要 在用户能够轻松的将消息队列跟其他系统(数据库、其他消息系统)一起使用时&#xff0c;消息队列的作用才是最强大的。而Pulsar IO connectors可以让你很轻松的创建、部署以及管理这些跟外部系统的连接&#…

Golang 开发实战day04 - Standard Library

Golang 开发实战day04 - Standard Library 接下来开始我们第四天学习&#xff0c;Go语言标准库提供了丰富的功能&#xff0c;可以帮助开发者快速完成各种任务。 golang就像其他语言一样&#xff0c;附带了一些非常轻量级的函数和特性&#xff0c;都是开箱即用的&#xff0c;这里…

KMM初探

什么是KMM&#xff1f; 在开始使用 KMM 之前&#xff0c;您需要了解 Kotlin。 KMM 全称&#xff1a;Kotlin Multiplatform Mobile&#xff09;是一个用于跨平台移动开发的 SDK,相比于其他跨平台框架&#xff0c;KMM是原生UI逻辑共享的理念,由KMM封装成Android(Kotlin/JVM)的aar…

第四百一十一回

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"给geolocator插件提交问题的结果"相关的内容&#xff0c;本章回中将介绍自定义标题栏.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我…

第四百一十二回

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"给geolocator插件提交问题的结果"相关的内容&#xff0c;本章回中将介绍自定义标题栏.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我…

我的自建博客之旅04之Halo

我的自建博客之旅04之Halo Halo是我无意间发现的一款博客框架,如果你讨厌Hexo,Vuepress等静态框架本地编辑,构建部署等方式,如果你想要一款一次搭建,前台是博客,后台是文章维护,并且支持各种定制化折腾的博客框架,可能Halo会比较适合你。 因为我个人还是比较偏技术,…

八节【DBA从入门到实践】课程,带你快速掌握OceanBase运维管理核心技能

为帮助用户及开发者更好、更快地掌握OceanBase DBA核心技能&#xff0c;OceanBase社区设计了配套教程——“DBA从入门到实践”。8期教程带大家循序渐进掌握OceanBase运维管理核心技能。搭配随堂习题和OceanBase技术专家在线答疑&#xff0c;快速掌握重要知识点&#xff0c;并轻…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Refresh)

可以进行页面下拉操作并显示刷新动效的容器组件。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 支持单个子组件。 从API version 11开始&#xff0c;Refresh子组件会跟随手势下拉而下移…

【数据结构】链表力扣刷题详解

前言 题目链接 移除链表元素 链表的中间结点 反转链表 分割链表 环形链表的约瑟夫问题 ​ 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 移除链表元素 题述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请…

搜维尔科技:OptiTrack提供了一个通用、精确、灵活和可监控的系统!

MELS集成OptiTrack与最前沿的虚拟生产阶段 在加拿大蒙特利尔&#xff0c;MELS Studios and Postproduction设有20个工作室&#xff0c;以满足各种规模的电影和电视项目的需求。凭借先进的技术设施和专业的技术团队&#xff0c;梅尔斯为电影行业的合作伙伴提供从摄影棚和设备租…

应用开发技术巩固指南

前言 起初毕业前夕&#xff0c;个人已经开始自学Android开发&#xff0c;由于没有指导&#xff0c;所以起步很难&#xff0c;写的代码也规范&#xff0c;逻辑不清&#xff0c;技术止步于皮毛&#xff0c;很多东西都不理解。 后来步入工作&#xff0c;逐渐熟悉了这个方向&…

Zustand极简的状态管理工具

介绍 一个小型、快速且可扩展的 Bearbones 状态管理解决方案。 Zustand 有一个基于 hooks 的舒适 API。它不是样板文件或固执己见&#xff0c;但有足够的惯例来明确和类似通量。 zustand官网 zustand使用方法及调试工具的安装使用 安装包 npm install zustand2.创建store仓…

【算法专题--双指针算法】leetcode--283. 移动零、leetcode--1089. 复写零

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 前言1. 移动零&#xff0…

多线程(部分)

Day28下2 多线程 一、什么是进程 进程是系统进行资源分配和调用的独立单元&#xff0c;每一个进程都有它的独立内存空间和系统资源。 二、单进程操作系统和多进程操作系统的区别 单进程操作系统&#xff1a;dos&#xff08;一瞬间只能执行一个任务&#xff09; 多进程单用户操…

想第一时间接收API变更信息?用Apipost这样做

Apipost致力于为开发者提供更全面的API管理功能。而最近&#xff0c;Apipost又新增了一个非常实用的功能&#xff1a;第三方消息推送。这个功能可以帮助开发人员及时了解API的变更情况&#xff0c;从而更好地管理和优化自己的API。 具体来说&#xff0c;Apipost的第三方消息推…

Linux操作系统——多线程

1.线程特性 1.1线程优点 创建一个新线程的代价要比创建一个新进程小得多与进程之间的切换相比&#xff0c;线程之间的切换需要操作系统做的工作要少很多线程占用的资源要比进程少很多能充分利用多处理器的可并行数量在等待慢速I/O操作结束的同时&#xff0c;程序可执行其他的计…

2024.3.9|第十五届蓝桥杯模拟赛(第三期)

2024.3.9|十五届蓝桥杯模拟赛&#xff08;第三期&#xff09; 第一题 第二题 第三题 第四题 第五题 第六题 第七题 第八题 第九题 第十题 心有猛虎&#xff0c;细嗅蔷薇。你好朋友&#xff0c;这里是锅巴的C\C学习笔记&#xff0c;常言道&#xff0c;不积跬步无以至千里&…