第十四届蓝桥杯大赛软件赛国赛Python大学B组题解

文章目录

  • 弹珠堆放
  • 划分
  • 偶串
  • 交易账本
  • 背包问题
  • 翻转
  • 最大阶梯
  • 最长回文前后缀
  • 贸易航线
  • 困局

弹珠堆放

在这里插入图片描述

递推式 a i = a i − 1 + i a_i=a_{i-1}+i ai=ai1+i n = 20230610 n=20230610 n=20230610非常小,直接模拟

答案等于 494 494 494

划分

在这里插入图片描述

  • 因为总和为 1 e 6 1e6 1e6,因此可以dp,就是一个存在性01背包问题
  • 答案为 12873625444 12873625444 12873625444

偶串

在这里插入图片描述

  • 直接一个桶记录就好
  • 才发现,蓝桥杯oj使用exit(0)会段错误得使用sys.exit(0)
import sys
from collections import defaultdict
input=lambda:sys.stdin.readline().strip()
read=lambda:map(int,input().split())d=defaultdict(int)
s=input()
for c in s:d[c]+=1for x,y in d.items():if y%2==1:print('NO')sys.exit(0)print('YES')

交易账本

在这里插入图片描述
恶心的模拟题

import sys
from collections import defaultdict
input=lambda:sys.stdin.readline().strip()
read=lambda:map(int,input().split())def solve():n,m=read()acc=[[] for _ in range(m)]vis=[[] for _ in range(m)]ok=Truefor _ in range(m):s=list(read())idx=0x=s[idx]idx+=1all=0f=Falsewhile x:x-=1id,c=s[idx],s[idx+1]idx+=2if id==-1 and c==-1:f=Truecontinueif c>=len(acc[id]):ok=Falsecontinueif vis[id][c]:ok=Falsecontinuevis[id][c]=Trueall+=acc[id][c]x=s[idx]idx+=1while x:x-=1id,c=s[idx],s[idx+1]idx+=2all-=cacc[_].append(c)vis[_].append(False)if not f and all!=0:ok=Falseprint('YES' if ok else 'NO')
T=1
T=int(input())
for _ in range(T):solve()

背包问题

在这里插入图片描述
在这里插入图片描述

  • 看数据应该是枚举其中一种cnt,vp过了赛后交一发t了,神奇的oj
  • 首先枚举前面两个桶装A的数量,然后前两个桶贪心地装B
  • 那么剩下一个桶呢?肯定是先贪心放体积更小的
  • 复杂度 O ( c n t 2 ) O(cnt^2) O(cnt2)
import sys
from collections import defaultdict
input=lambda:sys.stdin.readline().strip()
read=lambda:map(int,input().split())def solve():B=list(read())cnta,cntb=read()va,vb=read()ans=0for i in range(min(cnta,B[0]//va)+1):for j in range(min(cnta-i,B[1]//va)+1):ra=cnta-i-jA=[B[0]-i*va,B[1]-j*va,B[2]]res=i+jt=min(A[0]//vb+A[1]//vb,cntb)rb=cntb-tres+=tif va<vb:tmp=min(A[2]//va,ra)A[2]-=tmp*vares+=tmp+min(A[2]//vb,rb)else:tmp=min(A[2]//vb,rb)A[2]-=tmp*vbres+=tmp+min(A[2]//va,ra)ans=max(ans,res)print(ans)T=1+0
T=int(input())
for _ in range(T):solve()

翻转

在这里插入图片描述
在这里插入图片描述

  • 很典的线性dp, d p i , 0 / 1 dp_{i,0/1} dpi,0/1表示当前是否翻转即可
  • 复杂度 O ( n ) O(n) O(n)
import sys
from collections import defaultdict
from math import inf
input=lambda:sys.stdin.readline().strip()
read=lambda:map(int,input().split())def solve():n=int(input())dp=[[inf]*2 for _ in range(n+1)]s=[0]*(n+1)for i in range(1,n+1):s[i]=input()dp[1][0]=dp[1][1]=2for i in range(2,n+1):for x in range(2):for y in range(2):dp[i][y]=min(dp[i][y],dp[i-1][x]+2-(s[i][y]==s[i-1][x^1]))print(min(dp[n][0],dp[n][1]))T=1
# T=int(input())
for _ in range(T):solve()

最大阶梯

在这里插入图片描述
在这里插入图片描述

  • 全场第二恶心的题
  • vp没想好居然旋转了45度再dp
  • 实际上直接dp四次就行
  • 复杂度 O ( n 2 ) O(n^2) O(n2)
import sys
from collections import defaultdict
from math import inf
input=lambda:sys.stdin.readline().strip()
read=lambda:map(int,input().split())def solve():n=int(input())a=[[inf]*(n+2)]for _ in range(n):a.append([inf]+list(read())+[inf])a.append([inf]*(n+2))ans=0dp=[[0]*(n+10) for _ in range(n+10)]for i in range(1,n+1):for j in range(1,n+1):if a[i][j]==a[i-1][j]==a[i][j-1]:dp[i][j]=min(dp[i-1][j],dp[i][j-1])+1else:dp[i][j]=1ans=max(ans,dp[i][j])dp=[[0]*(n+10) for _ in range(n+10)]for i in range(n,0,-1):for j in range(1,n+1):if a[i][j]==a[i+1][j]==a[i][j-1]:dp[i][j]=min(dp[i+1][j],dp[i][j-1])+1else:dp[i][j]=1ans=max(ans,dp[i][j])dp=[[0]*(n+10) for _ in range(n+10)]for i in range(1,n+1):for j in range(n,0,-1):if a[i][j]==a[i-1][j]==a[i][j+1]:dp[i][j]=min(dp[i-1][j],dp[i][j+1])+1else:dp[i][j]=1ans=max(ans,dp[i][j])dp=[[0]*(n+10) for _ in range(n+10)]for i in range(n,0,-1):for j in range(n,0,-1):if a[i][j]==a[i+1][j]==a[i][j+1]:dp[i][j]=min(dp[i+1][j],dp[i][j+1])+1else:dp[i][j]=1ans=max(ans,dp[i][j])print(ans)T=1
# T=int(input())
for _ in range(T):solve()

最长回文前后缀

在这里插入图片描述

  • 也是很典的manacher问题
  • 注意:前缀和后缀其中一个可以为0(这点题没表述清wa了一个点),其次数据太水,为什么 n 2 n^2 n2只是t一个点
  • 首先最小答案为1
  • 如果原本就是回文串,那么输出 2 n 2n 2n
  • 如果前后缀都选的话,那么假设前缀为 A A A,后缀为 B B B,且 ∣ A ∣ ≥ ∣ B ∣ |A| \geq |B| AB,那么 ∣ A ∣ = B r e v S |A|=B_{rev}S A=BrevS,因此最后的拼接字符串必定是 B S B r e v BSB_{rev} BSBrev这种形式
  • 用manacher预处理出 L i L_i Li表示以 i i i为左端点的最长回文串, R i R_i Ri表示以 i i i为右端点的最长回文串
  • 那么我们枚举前后缀的合法长度,假设 S [ 1 : i ] = S [ n − i + 1 : n ] S[1:i]=S[n-i+1:n] S[1:i]=S[ni+1:n],然后我们看中间部分是属于前缀还是后缀即可
  • 复杂度 O ( n ) O(n) O(n)
import sys
from collections import defaultdict
from math import inf
input=lambda:sys.stdin.readline().strip()
read=lambda:map(int,input().split())def manacher(s):n=len(s)s='^#'+'#'.join(s)+'#$'id,mr=0,0p=[0]*(len(s))for i in range(1,2*n+1):if i<mr:p[i]=min(p[2*id-i],mr-i)else:p[i]=1while s[i+p[i]]==s[i-p[i]]:p[i]+=1if i+p[i]>mr:id=imr=i+p[i]return pdef solve():s=input()p=manacher(s)# print(p)n=len(s)L=[0]*(n+1)R=[0]*(n+1)for i in range(1,2*n+1):if p[i]<=1:continuer=(p[i]-1)//2if i%2==0:L[i//2-r]=max(L[i//2-r],p[i]-1)R[i//2+r]=max(R[i//2+r],p[i]-1)else:L[i//2-r+1]=max(L[i//2-r+1],p[i]-1)R[i//2+r]=max(R[i//2+r],p[i]-1)Len=0i,j=0,n-1ok=0while i<=j:if s[i]!=s[j]:Len=iok=1breaki+=1j-=1if not ok:print(2*n)returnif Len==0:print(1)return# for i in range(1,n):print(i,L[i],R[i])ans=0for l in range(1,Len+1):# print(l,2*l+L[l+1],2*l+R[n-l])ans=max(ans,l*2+L[l+1],l*2+R[n-l])print(ans)T=1
# T=int(input())
for _ in range(T):solve()

贸易航线

在这里插入图片描述
在这里插入图片描述

  • 思维题
  • 关键点:每次卖出肯定是只卖一种商品更优的
  • 因此我们每次看卖哪种商品即可
  • 定义 d p i dp_i dpi为在第 i i i个点,刚好卖出所有物品的最大收益
  • 定义 m x j mx_j mxj表示前面买入了 j j j物品后的最大收益
  • 那么转移很简单,如果不卖任何商品 d p i = d p i − 1 dp_i=dp_{i-1} dpi=dpi1
  • 卖第 j j j个物品, d p i = m x j + k ⋅ P i , j dp_{i}=mx_j+k\cdot P_{i,j} dpi=mxj+kPi,j
  • 更新 m x j mx_j mxj m x j = m a x ( m x j , d p i − k ⋅ P i , j ) mx_j=max(mx_j,dp_i-k \cdot P_{i,j}) mxj=max(mxj,dpikPi,j)
import sys
from collections import defaultdict
from math import inf
input=lambda:sys.stdin.readline().strip()
read=lambda:map(int,input().split())def solve():n,m,k=read()P=[[0]*(n+1)]dp=[-inf]*(n+1)dp[0]=0for i in range(n):P.append([0]+list(read()))mx=[-inf]*(m+1)ans=0for i in range(1,n+1):dp[i]=max(dp[i],dp[i-1])for j in range(1,m+1):if P[i][j]==-1:continuedp[i]=max(dp[i],mx[j]+P[i][j]*k)for j in range(1,m+1):if P[i][j]==-1:continuemx[j]=max(mx[j],dp[i]-P[i][j]*k)ans=max(ans,dp[i])print(ans)
T=1
# T=int(input())
for _ in range(T):solve()

困局

在这里插入图片描述
在这里插入图片描述

  • 暴力,可以拿30%
  • 打表发现k为奇数无解
import sys
from collections import defaultdict
from math import inf
input=lambda:sys.stdin.readline().strip()
read=lambda:map(int,input().split())MOD=998244353
n,k=read()
if k%2==1:print(0)sys.exit(0)
match=[0]*(n+1)
def check():x=0cnt=0vis=[0]*(n+1)while True:x+=1if x>n:breakif match[x] and not vis[x]:vis[x]=1x=match[x]cnt+=1return cnt==2*kans=[0]
def dfs(x,st):if x==k+1:if check():ans[0]+=1# print(match[1:])returnfor i in range(st+1,n+1):if match[i]:continuefor j in range(i+1,n+1):if match[j]:continuematch[i]=jmatch[j]=idfs(x+1,i)match[i]=0match[j]=0dfs(1,0)
print(ans[0]%MOD)
  • 发现方案只与这 2 k 2k 2k个位置有关,因此我们先令 n = 2 k n=2k n=2k计算出相对顺序的方案数 a n s ans ans
  • vp的时候居然没想到如此简单的方法,但是官方正解好像不是这个。。
  • 那么计算出相对顺序后,只需要在n个点选2k个即可,答案就是 a n s ⋅ ( n 2 k ) ans \cdot \binom{n}{2k} ans(2kn)
import sys
from collections import defaultdict
from math import inf
input=lambda:sys.stdin.readline().strip()
read=lambda:map(int,input().split())MOD=998244353
n,k=0,0
match=[]
def check():x=0cnt=0vis=[0]*(n+1)while True:x+=1if x>n:breakif match[x] and not vis[x]:vis[x]=1x=match[x]cnt+=1return cnt==2*kans=[0]
def dfs(x,st):if x==k+1:if check():ans[0]+=1# print(match[1:])returnfor i in range(st+1,n+1):if match[i]:continuefor j in range(i+1,n+1):if match[j]:continuematch[i]=jmatch[j]=idfs(x+1,i)match[i]=0match[j]=0
nn,kk=read()
if kk%2:print(0)sys.exit(0)k=kk
n=2*k
match=[0]*(n+1)
dfs(1,0)n=nn
fac=[1]*(n+1)
inv=[0]*(n+1)
for i in range(2,n+1):fac[i]=fac[i-1]*i%MODinv[n]=pow(fac[n],MOD-2,MOD)
for i in range(n-1,-1,-1):inv[i]=inv[i+1]*(i+1)%MODdef C(n,m):if n<m:return 0return fac[n]*inv[m]*inv[n-m]%MODprint(ans[0]*C(n,2*k)%MOD)

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

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

相关文章

Python 和 JavaScript两种语言的相似部分-由DeepSeek产生

Python 和 JavaScript 作为两种流行的编程语言&#xff0c;虽然在设计目标和应用场景上有差异&#xff08;Python 偏向后端和脚本&#xff0c;JavaScript 偏向前端和动态交互&#xff09;&#xff0c;但它们的语法存在许多相似之处。以下是两者在语法上的主要共同点及对比&…

改善 Maven 的依赖性

大家好&#xff0c;这里是架构资源栈&#xff01;点击上方关注&#xff0c;添加“星标”&#xff0c;一起学习大厂前沿架构&#xff01; 建议使用mvn dependency:analyze命令来摆脱已声明但未使用的依赖项&#xff1a; 还有另一个用例&#xff0c; mvn dependency:analyze 它可…

【SQL】子查询详解(附例题)

子查询 子查询的表示形式为&#xff1a;(SELECT 语句)&#xff0c;它是IN、EXISTS等运算符的运算数&#xff0c;它也出现于FROM子句和VALUES子句。包含子查询的查询叫做嵌套查询。嵌套查询分为相关嵌套查询和不想关嵌套查询 WHERE子句中的子查询 比较运算符 子查询的结果是…

Stable Diffusion 扩展知识实操整合

本文的例子都是基于秋叶整合包打开的webui实现的 一、ADetailer——改善人脸扭曲、恶心 After detailer插件可以自动检测生成图片的人脸&#xff0c;针对人脸自动上蒙版&#xff0c;自动进行重绘&#xff0c;整个流程一气呵成&#xff0c;因此可以避免许多重复的操作。除此之…

freertos内存管理简要概述

概述 内存管理的重要性 在嵌入式系统中&#xff0c;内存资源通常是有限的。合理的内存管理可以确保系统高效、稳定地运行&#xff0c;避免因内存泄漏、碎片化等问题导致系统崩溃或性能下降。FreeRTOS 的内存管理机制有助于开发者灵活地分配和释放内存&#xff0c;提高内存利用…

按规则批量修改文件扩展名、删除扩展名或添加扩展名

文件的扩展名是多种多样的&#xff0c;有些不同文件的扩展名之间相互是可以直接转换的。我们工作当中最常见的就是 doc 与 docx、xls 与 xlsx、jpg 与 jpeg、html 与 htm 等等&#xff0c;这些格式在大部分场景下都是可以相互转换 能直接兼容的。我们今天要介绍的就是如何按照一…

热门面试题第15天|最大二叉树 合并二叉树 验证二叉搜索树 二叉搜索树中的搜索

654.最大二叉树 力扣题目地址(opens new window) 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下&#xff1a; 二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大…

MySQL学习笔记7【InnoDB】

Innodb 1. 架构 1.1 内存部分 buffer pool 缓冲池是主存中的第一个区域&#xff0c;里面可以缓存磁盘上经常操作的真实数据&#xff0c;在执行增删查改操作时&#xff0c;先操作缓冲池中的数据&#xff0c;然后以一定频率刷新到磁盘&#xff0c;这样操作明显提升了速度。 …

RNN、LSTM、GRU汇总

RNN、LSTM、GRU汇总 0、论文汇总1.RNN论文2、LSTM论文3、GRU4、其他汇总 1、发展史2、配置和架构1.配置2.架构 3、基本结构1.神经元2.RNN1. **RNN和前馈网络区别&#xff1a;**2. 计算公式&#xff1a;3. **梯度消失:**4. **RNN类型**:&#xff08;查看发展史&#xff09;5. **…

django数据迁移操作受阻

错误信息&#xff1a; django.db.utils.OperationalError: (1227, Access denied; you need (at least one of) the SYSTEM_VARIABLES_ADMIN or SESSION_VARIABLES_ADMIN privilege(s) for this operation)根据错误信息分析&#xff0c;该问题是由于MySQL用户 缺乏SYSTEM_VARI…

WinForm真入门(13)——ListBox控件详解

WinForm ListBox 详解与案例 一、核心概念 ‌ListBox‌ 是 Windows 窗体中用于展示可滚动列表项的控件&#xff0c;支持单选或多选操作&#xff0c;适用于需要用户从固定数据集中选择一项或多项的场景‌。 二、核心属性 属性说明‌Items‌管理列表项的集合&#xff0c;支持动…

局域网内文件共享的实用软件推荐

软件介绍 在日常办公、学习或家庭网络环境里&#xff0c;局域网内文件共享是个常见需求。有一款免费的局域网共享软件非常适合这种场景。 这款局域网共享软件使用起来非常简单&#xff0c;不需要安装&#xff0c;直接点击就能使用。 它的操作流程简单易懂&#xff0c;用户只要…

ViewModel vs AndroidViewModel:核心区别与使用场景详解

在 Android 的 MVVM 架构中&#xff0c;ViewModel 和 AndroidViewModel 都是用于管理 UI 相关数据的组件&#xff0c;但二者有一些关键区别&#xff1a; 1. ViewModel 基本用途&#xff1a;用于存储和管理与 UI 相关的数据&#xff0c;生命周期与 Activity/Fragment 解耦&…

C语言--求n以内的素数(质数)

求n以内的素数&#xff0c;可以用试除法或者埃拉托斯特尼筛法&#xff08;埃氏筛法&#xff09; 文章目录 试除法埃拉托斯特尼筛法&#xff08;埃氏筛法&#xff09;两种方法测试运行效率 输入&#xff1a;数字n 输出&#xff1a;n以内所有的素数 不管是哪个方法&#xff0c;都…

Skynet.socket 函数族使用详解

目录 Skynet.socket 函数族使用详解核心功能分类一、TCP 连接管理1. 监听端口2. 建立连接3. 关闭连接 二、数据读写操作1. 阻塞式读取2. 写入数据2.1 socket.write(fd, data) 的返回值2.2 示例代码2.3 关键注意事项2.4 与其他函数的区别2.5 底层原理2.6 总结 三、UDP 处理1. 创…

Unity Addressables资源生命周期自动化监控技术详解

一、Addressables资源生命周期管理痛点 1. 常见资源泄漏场景 泄漏类型典型表现检测难度隐式引用泄漏脚本持有AssetReference未释放高异步操作未处理AsyncOperationHandle未释放中循环依赖泄漏资源相互引用无法释放极高事件订阅泄漏未取消事件监听导致对象保留高 2. 传统管理…

aws(学习笔记第三十八课) codepipeline-build-deploy-github-manual

文章目录 aws(学习笔记第三十八课) codepipeline-build-deploy-github-manual学习内容:1. 整体架构1.1 代码链接1.2 全体处理架构2. 代码分析2.1 创建`ImageRepo`,并设定给`FargateTaskDef`2.2 创建`CodeBuild project`2.3 对`CodeBuild project`赋予权限(`ECR`的`image rep…

在windows服务器使用Nginx反向代理云端的python实现的web应用

近日得闲&#xff0c;计划将之前写过的一些小桌面程序搬到云服务器上方便随时随地使用&#xff0c;同时也学习一些基本的网站开发和搭建知识&#xff0c;于是在AI的帮助下&#xff0c;基于niceguifastapi非常快捷地搞出来了一个前后端一体的网站程序&#xff0c;放在云服务器上…

全球贸易战火重燃:50%关税如何绞杀跨境电商低价模式?

一、政策高压&#xff1a;美国对华贸易战升级路线图 2024年5月&#xff0c;美国国会《数字贸易壁垒法案》草案曝光&#xff0c;标志着中美贸易博弈进入新阶段&#xff1a; • 关税武器精准打击&#xff1a;成衣、消费电子、小家电税率拟从10-25%跃升至50% • 监管范围扩大&…

0411 | 软考高项笔记:项目立项

在软考的项目管理知识体系中&#xff0c;技术可行性和经济可行性是项目立项阶段非常重要的两个分析维度。以下是对这两个考点的详细解释和记忆方法&#xff1a; 技术可行性分析 定义&#xff1a; 技术可行性分析是评估项目在现有技术条件和资源下是否能够成功实施。它主要回答…