2025蓝桥杯python A组题解
真捐款去了,好长时间没练了,感觉脑子和手都不转悠了。 B F BF BF 赛时都写假了, G G G 也只写了爆搜。
题解其实队友都写好了,我就粘一下自己的代码,稍微提点个人的理解水一篇题解
队友题解
B
思路:
我是直接枚举八个段是否填 0 0 0,确定哪些段填 0 0 0 后,缩写形式也就唯一确定了。接下来我们只需要确定填非 0 0 0 的段的长度和可能数。
确定填 0 0 0 段和冒号的长度重点在于确定缩写的位置,无外乎三种情况:
- 开头或结尾的连续 0 0 0 段缩写
- 中间的连续 0 0 0 段缩写
- 不缩写(其实只要缩写就一定不差于不缩写)
假设总共有 n n n 段(其实就是 8 8 8),总共有 n u m 0 num0 num0 个 0 0 0,开头或结尾的最长连续 0 0 0 段长度为 a n s 1 ans1 ans1,中间的最长连续 0 0 0 段长度为 a n s 2 ans2 ans2,那么三种情况的答案分别是:
- 除缩写部分的剩余部分长度为 n − a n s 1 n-ans1 n−ans1,需要 n − a n s 1 − 1 n-ans1-1 n−ans1−1 个冒号分割。缩写需要 2 2 2 个冒号。剩余未被缩写的 0 0 0 的个数为 n u m 0 − a n s 1 num0-ans1 num0−ans1,因此总长度为 ( n − a n s 1 − 1 ) + 2 + ( n u m 0 − a n s 1 ) (n-ans1-1)+2+(num0-ans1) (n−ans1−1)+2+(num0−ans1)
- 除缩写部分的剩余部分总长度为 n − a n s 2 n-ans2 n−ans2,需要 n − a n s 2 − 2 n-ans2-2 n−ans2−2 个冒号分割(因为是左右两个部分)。缩写需要 2 2 2 个冒号。剩余未被缩写的 0 0 0 的个数为 n u m 0 − a n s 2 num0-ans2 num0−ans2,因此总长度为 ( n − a n s 2 − 2 ) + 2 + ( n u m 0 − a n s 2 ) (n-ans2-2)+2+(num0-ans2) (n−ans2−2)+2+(num0−ans2)
- n − 1 + n u m 0 n-1+num0 n−1+num0
非零段长度变化时,以外的部分(填 0 0 0 段和冒号)的长度是不变的,假设这个填 0 0 0 段和冒号总长度是 l e n len len。接下来需要确定非 0 0 0 的段的所有情况的总长度,这个部分我们直接爆搜,假设有 p o s pos pos 个非零段,每个段分别有 1 6 1 − 1 6 0 = 15 , 1 6 2 − 1 6 1 = 240 , 1 6 3 − 1 6 2 = 3840 , 1 6 4 − 1 6 3 = 61440 16^1-16^0=15, 16^2-16^1=240, 16^3-16^2=3840, 16^4-16^3=61440 161−160=15,162−161=240,163−162=3840,164−163=61440 种情况,长度分别为 1 , 2 , 3 , 4 1,2,3,4 1,2,3,4,这样爆搜的次数是 4 p o s ≤ 4 8 = 65536 4^{pos}\le 4^8=65536 4pos≤48=65536 次,可以跑得动。
另外因为全 0 0 0 段的时候比较特殊,所以单独计数。
code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;int get_len(string s){//得到简化后的冒号和0位置的总长度 int n=s.length();int ans1=0,ans2=0,num0=0;for(int i=0;i<n;i++)if(s[i]=='0')num0++;for(int i=0;i<n;i++)if(s[i]!='0'){ans1=max(ans1,i);break;}for(int i=n-1;i>=0;i--)if(s[i]!='0'){ans1=max(ans1,n-i-1);break;}for(int l=1,r=0;l<n-1;l=r+1){r++;while(s[r]=='0' && r<n-1)r++;ans2=max(ans2,r-l);}
// cout<<ans1<<" "<<ans2<<" "<<num0<<endl;return min(min(n-ans1-1+2+(num0-ans1),n-ans2-2+2+(num0-ans2)),n-1+num0);
}ll tm[]={15,240,3840,61440};
ll len;//某种选取情况的长度
vector<ll> take;//某种选取情况
ll tot;//所有情况的总长度
void dfs(int pos){if(pos<=0){ll t=1;for(auto x:take)t=t*x%mod;//这种选取情况下的情况数 tot=(tot+t*len%mod)%mod;return;}for(int i=0;i<4;i++){len+=i+1;take.push_back(tm[i]);dfs(pos-1);take.pop_back();len-=i+1;}
}signed main(){ll ans=2; for(int i=1;i<(1<<8);i++){string s;for(int j=0;j<8;j++)s += "01"[(i>>j)&1];len=get_len(s);int num1=0;for(int i=0;i<s.length();i++)if(s[i]=='1')num1++;dfs(num1);ans=(ans+tot)%mod;tot=0;
// cout<<s<<" "<<get_len(s)<<" "<<num1<<" "<<tot<<endl;
// cout<<ans<<endl;}cout<<ans;return 0;
}
C
code:
import sys
input = sys.stdin.readlineh, w = map(int, input().split())
s = "2025" * 1145
for i in range(h):print(s[i:i+w])
D
思路:
p y t h o n python python 的 s o r t sort sort 只能指定按照某个位置的值进行排序,不能对两个数做操作来确定大小。
为了解决这个问题可以用 functools 的 cmp_to_key,或者重写类的 __lt__ 方法。
code:
from functools import cmp_to_keyn = int(input())
s = [bin(x)[2:] for x in range(1, n+1)]def cmp(a: str, b: str)-> int:if a+b < b+a:return -1elif a+b == b+a:return 0else:return 1s.sort(key=cmp_to_key(cmp), reverse=True)
print(int("".join(s), 2))
E
思路:
队友写假了,这个水是不能往前面的位置倒的,所以就不能求平均数了。
这个题正解是二分答案,很板。
大体思路就是二分答案,对一个需要验证的答案,如果一个位置的水量高于答案,就把多余的部分都给后面。如果这个位置水量不够答案,就说明通过前面的努力是不够填满它的,这个答案就不成立。
如果不会写整数二分,可以在 l , r l,r l,r 范围缩到足够小时,对小范围进行暴力枚举验证。
code:
import copy
import sys
input = sys.stdin.readline
n, k = list(map(int, input().split()))
a = list(map(int, input().split()))def check(height):t = copy.deepcopy(a)for i in range(n):if t[i] < height:return Falseif i + k < n:t[i + k] += t[i] - heightreturn Truel, r = 1, 10**20
while l < r:mid = (l + r + 1) // 2if check(mid):l = midelse:r = mid - 1print(l)"""
8 3
5 6 4 8 3 4 1 9"""
F
思路:
赛时写完发现想假了,不过没时间了就直接交了。思路和队友是一样的,直接看他的讲解吧。
这题 n = 1000 n=1000 n=1000 还能暴力啊……
不怎么会写暴搜,暴力杯吃大亏。
code:
n = int(input())
cnt = [0]*7
for x in input().split():cnt[min(6, x.count("6"))] += 1# n = 1000
# cnt = [200 for _ in range(7)]visit = dict()
ans, cur = 0, 0def dfs(status):# status状态下的最大值global ans, curif len(tuple(x for x in status if x < 0)) > 0:returnif visit.get(tuple(status)):return visit.get(tuple(status))if sum(status) // 2 + cur <= ans:returnif sum([i*x for i, x in enumerate(status, start=1)]) // 6 + cur <= ans:return# print(status)ans = max(ans, cur)for i in range(1, 6):for j in range(max(6-i, i), 6):status[i - 1] -= 1status[j - 1] -= 1cur += 1dfs(status)cur -= 1status[i - 1] += 1status[j - 1] += 1for i in range(1, 6):for j in range(i, 6):for k in range(max(6-i-j, j), 6):status[i - 1] -= 1status[j - 1] -= 1status[k - 1] -= 1cur += 1dfs(status)cur -= 1status[i - 1] += 1status[j - 1] += 1status[k - 1] += 1visit[tuple(status)] = curdfs(cnt[1:6])print(ans + cnt[6])"""
8
666666 666 666 666 66 6 6 6"""
G
思路:
队友说是染色,其实就是并查集合并连通块,并额外处理一个连通块内所有点的最大高度(因为一个连通块内是互相可达的)
假设我们处理前面一段高度,得到了若干组,你会发现这些组的值域互不覆盖,且位置越靠后,值越大。
当我们加入一个更高高度的点时(比前面所有高度都高),因为不能到达前面任何一个点,它就会成为新的组。
当我们加入一个低于前面若干高度的点时,它就会和前面所有存在高于它的点的组进行合并,成为一个组。
发现我们其实只需要知道每个组的最大高度就可以了,所以我们可以用单调栈来维护每个组的最大值,并从顶到底按照从大到小的顺序放好。
之后每一行跑一遍,每一列跑一遍就好了。
code:
原代码的下标映射有些混乱,所以改成了从 ( 0 , 0 ) (0,0) (0,0) 到 ( n − 1 , m − 1 ) (n-1,m-1) (n−1,m−1)
n, m = map(int, input().split())mp = [[0] * m for _ in range(n)]
for i in range(n):mp[i][:] = map(int, input().split())f = [0] * (n*m)
maxh = [0] * (n*m)
for i in range(n*m):f[i] = imaxh[i] = mp[i // m][i % m]def to_idx(x, y):return x*m+ydef findf(x):if f[x] == x:return xelse:f[x] = findf(f[x])return f[x]def merge(u, v):fu, fv = findf(u), findf(v)maxh[fu] = max(maxh[fu], maxh[fv])f[fv] = fufor i in range(n):stack = list() # 高度 并查集位置for j in range(m):idx = to_idx(i, j)maxx = mp[i][j]while stack and stack[-1][0] > mp[i][j]:maxx = max(maxx, stack[-1][0])merge(stack[-1][1], idx)stack.pop()stack.append((maxx, idx))for j in range(m):stack = list() # 高度 并查集位置for i in range(n):idx = to_idx(i, j)maxx = mp[i][j]while stack and stack[-1][0] > mp[i][j]:maxx = max(maxx, stack[-1][0])merge(stack[-1][1], idx)stack.pop()stack.append((maxx, idx))ans = 0
for i in range(n):for j in range(m):fa = findf(to_idx(i, j))ans += maxh[fa]print("{:.6f}".format(ans/(n*m)))"""
2 2
1 4
4 32 3
2 4 1
4 2 3"""
H
思路:
感觉 H < F < G H < F < G H<F<G,这题是个标准的反悔贪心。
优先队列还是前一天晚上临时看的。
感觉没什么好写的,就丢个类似的题吧 你是银狼
相关文章:
2025蓝桥杯python A组题解
真捐款去了,好长时间没练了,感觉脑子和手都不转悠了。 B F BF BF 赛时都写假了, G G G 也只写了爆搜。 题解其实队友都写好了,我就粘一下自己的代码,稍微提点个人的理解水一篇题解 队友题解 B 思路: 我…...
使用Python建模量子隧穿
引言 量子隧穿是量子力学中的一个非常有趣且令人神往的现象。在经典物理学中,我们通常认为粒子必须克服一个势垒才能通过它。但是,在量子力学中,粒子有时可以“穿越”一个势垒,即使它的能量不足以克服这个势垒。这种现象被称为“量子隧穿”。今天,我们将通过 Python 来建…...
微信小程序开发常用语法和api
vue写习惯了,小程序太久不做,一些语法和api都忘记。本文总结下小程序常用的语法和api 语法 绑定事件和传参 绑定事件还有很多,触摸反馈事件,表单事件,媒体事件后续更新细说。 <!-- 绑定事件 bindtap 事件传参 da…...
【时时三省】(C语言基础)选择结构程序综合举例
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 下面综合介绍几个包含选择结构的应用程序。 例题1: 写一程序,判断某一年是否为闰年。 程序1: 先画出判别闰年算法的流程图,见下图用变量le…...
Redis实现分布式定时任务
设计思路 任务表示:每个任务通过一个特定格式的键来表示。键名可以包含任务ID等信息,值可以是任务的具体内容或指向任务详情的引用。过期机制:利用Redis的EXPIRE命令为任务设置过期时间,当到达设定的时间点时,Redis会…...
File 类 (文件|文件夹操作)
一、File 类 1.1 前言 在 JDK 中 通过 java.io.File 类,可以实现操作系统重文件|文件夹的创建、删除、查看、重命名等操作。 1.2 File 类构造方法 File 一共提供了四个构造方法,都是有参构造。其中最常使用的是 File(String) 和 File(String, String)…...
Html页面Table表格导出导入Excel文件 xlsx.full
Html页面Table表格导出Excel文件 引用 xlsx.full.min.js 文件 导出 <!DOCTYPE html> <html> <head><meta charset"utf-8" /><title></title><script src"https://cdn.bootcdn.net/ajax/libs/jquery/3.6.3/jquery.min.j…...
【资料分享】瑞芯微RK3576,8核2.2GHz+6T算力NPU工业核心板说明书
核心板简介 创龙科技SOM-TL3576-S是一款基于瑞芯微RK3576J/RK3576高性能处理器设计的4核ARM Cor...
埃隆·马斯克如何通过开源创新塑造未来
李升伟 编译 埃隆马斯克的名字在多个行业回响——从电动汽车、太空探索到人工智能及更多领域。虽然许多人关注他革命性的公司(如特斯拉、SpaceX、Neuralink和The Boring Company),但较少有人意识到他在开源软件运动中悄然却深远的影响力。本…...
ALOPS智能化运维管理平台
AIOps(Artificial Intelligence for IT Operations)即智能运维,是将人工智能技术应用于 IT 运维管理领域,以实现自动化、智能化的运维决策和管理。以下是关于 AIOps 的详细介绍: 核心能力 数据收集与整合:…...
Hadoop文件操作指南:深入解析文件操作
1 Hadoop文件系统概述 Hadoop分布式文件系统(HDFS)是Hadoop生态的核心存储组件,专为大规模数据集设计,具有高容错性和高吞吐量特性。 HDFS核心特性: 分布式存储:文件被分割成块(默认128MB)分布存储多副本机制:每个块默认3副本&…...
使用Fortran读取HDF5数据
使用Fortran读取HDF5数据 下面我将介绍如何在Fortran中读取HDF5文件中的各种类型数组数据,包括一维数组、二维数组、元数组和变长数组。 准备工作 首先需要确保系统安装了HDF5库,并且在编译时链接了HDF5库。例如使用gfortran编译时: gfor…...
STM32 HAL库之EXTI示例代码
外部中断按键控制LED灯 在main.c中 HAL_Init(); 初始化Flash,中断优先级以及HAL_MspInit函数,也就是 stm32f1xx_hal.c 中 HAL_StatusTypeDef HAL_Init(void) {/* Configure Flash prefetch */ #if (PREFETCH_ENABLE ! 0) #if defined(STM32F101x6) || …...
通过C#将GB18030编码转义为UTF-8
使用C#代码,对于GB18030编码转义为UTF-8格式。 using System.Text;public class FileEncodingConverter {// 支持转换的文件扩展名列表(可根据需求扩展)private static readonly string[] SupportedExtensions { ".sln", ".…...
《TCP/IP网络编程》学习笔记 | Chapter 23:IOCP
《TCP/IP网络编程》学习笔记 | Chapter 23:IOCP 《TCP/IP网络编程》学习笔记 | Chapter 23:IOCP通过重叠 I/O 理解 IOCPepoll 和 IOCP 的性能比较实现非阻塞模式的套接字以纯重叠 I/O 方式实现回声服务器端重新实现客户端测试从重叠 I/O 模型到 IOCP 模型…...
Java学习打卡-Day25-注解和反射、Class类
注解(JDK5引入) 什么是注解? Java注解(Annotation),也叫元数据。一种代码级别的说明,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面…...
电感、互感器、变压器和磁珠综合对比——《器件手册--电感/线圈/变压器/磁珠篇》
三、电感/线圈/变压器/磁珠 名称 定义 特点...
CAD导入arcgis中保持面积不变的方法
1、加载CAD数据,选择面数据,如下: 2、加载进来后,右键导出数据,导出成面shp数据,如下: 3、选择存储路径,导出面后计算面积,如下: 4、与CAD中的闭合线面积核对…...
rustdesk自建服务器怎么填写客户端配置信息
目录 # id、api、中继都怎么填?rustdesk程序启动后服务不自动启动 # id、api、中继都怎么填? rustdesk程序启动后服务不自动启动 完全退出RudtDesk程序(右下角托盘区有的话,需要右键点退出) 创建windows服务ÿ…...
c++进阶之----智能指针
1.概念 在 C 中,智能指针是一种特殊的指针类型,它封装了裸指针(raw pointer)的行为,并通过 RAII(Resource Acquisition Is Initialization,资源获取即初始化)机制自动管理动态分配的…...
六、测试分类
设计测试用例 万能公式:功能测试性能测试界面测试兼容性测试安全性测试易用性测试 弱网测试:fiddler上行速率和下行速率 安装卸载测试 在工作中: 1.基于需求文档来设计测试用例(粗粒度) 输入字段长度为6~15位 功…...
Apollo源码总结
官方课程 项目源码 源码库简介: 1.apollo:算法库 2.apollo-kernel:改进LINUX内核。添加实时性补丁。 3. apollo-platform:改进ROS系统。去中心化,增加共享内存通信方式,兼容protobuf。 4.apollo-contrib&am…...
电感详解:定义、作用、分类与使用要点
一、电感的基本定义 电感(Inductor) 是由导线绕制而成的储能元件,其核心特性是阻碍电流变化,将电能转化为磁能存储。 基本公式: 自感电动势: E -L * (di/dt) (L:电感值,…...
AI编程案例拆解|基于机器学习XX评分系统-前端篇
文章目录 1. 定价使用DeepSeek估价小红书调研 2. 确定工作事项利用DeepSeek生成具体工作事项 3. 和客户沟通约会议沟通确定内容样式 4. 前端部分设计使用DeepSeek生成UI设计在Cursor中生成并提问前置条件开始编程 关注不迷路,励志拆解100个AI编程、AI智能体的落地应…...
java数组06:Arrays类
Arrays类 数组的工具类java.util. Arrays 由于数组对象本身并没有什么方法可以供我们调用,但API中是了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作。 查看JDK帮助文档 Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用…...
TQTT_KU5P开发板教程---实现流水灯
文档实现功能介绍 本文档是学习本开发板的基础,通过设置计数器使led0到led7依次闪烁,让用户初步认识vivado基本的开发流程以及熟悉项目的创建。本开发板的所有教程所使用的软件都是vivado2024.1版本的。可以根据网上的教程下载与安装。 硬件资源 此次教程…...
Model Context Protocol(MCP)模型上下文协议
Model Context Protocol(MCP)模型上下文协议 前言一、什么是MCP二、MCP的作用三、MCP与Function call对比四、构建一个简单的MCP DEMO环境准备实现MCP Server运行 ServerMCP Client端配置验证 总结 前言 在Agent时代,将Agent确立为大模型未来…...
第十二章:FreeRTOS多任务创建与删除
FreeRTOS多任务创建与删除教程 概述 本教程介绍FreeRTOS多任务的创建与删除方法,主要涉及两个核心函数: 任务创建:xTaskCreate()任务删除:vTaskDelete() 实践步骤 1. 准备工程文件 复制005工程并重命名为006 2. 创建多个任务…...
Seed-Thinking-v1.5:字节豆包新推理模型发布,200B参数战胜Deepseek
摘要 本文引入了Seed-Thinking-v1.5,能够在响应之前通过思考进行推理,从而提高了各种基准测试的性能。Seed-Thinking-v1.5在AIME 2024上获得86.7分,在Codeforces上获得55.0分,在GPQA上获得77.3分,展示了优秀的STEM和编…...
C#.NET模拟用户点击按钮button1.PerformClick自动化测试
PerformClick英文词是什么意思,几个词组成 PerformClick 是一个由两个英文单词组成的合成词,下面为你分别解释每个部分的含义以及整个词在编程语境中的意义: 单个单词含义 Perform:它是一个动词,读音为 /pəˈfɔːm/ÿ…...
