第十四屆藍橋杯大賽軟件賽國賽Python大學B組題解

文章目錄

  • 彈珠堆放
  • 劃分
  • 偶串
  • 交易賬本
  • 背包問題
  • 翻轉
  • 最大階梯
  • 最長回文前后綴
  • 貿易航線
  • 困局

彈珠堆放

在這里插入圖片描述

遞推式 a i = a i ? 1 + i a_i=a_{i-1}+i ai?=ai?1?+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=Brev?S,因此最后的拼接字符串必定是 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[n?i+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?=dpi?1?
  • 賣第 j j j個物品, d p i = m x j + k ? P i , j dp_{i}=mx_j+k\cdot P_{i,j} dpi?=mxj?+k?Pi,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?,dpi??k?Pi,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.pswp.cn/news/901025.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901025.shtml
英文地址,請注明出處:http://en.pswp.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; 技術可行性分析是評估項目在現有技術條件和資源下是否能夠成功實施。它主要回答…