第十三届蓝桥杯A组Python组心得分享
第一次寫心得類的文章,趁著假期有時間,記錄一下在準備這個比賽間的一些心得和一些問題的思路。(前面是碎碎念,直接看問題解決思路的可以跳到后面)
先說情況:省一,小題對了第一個,大題寫出來了五個(不確定是否全部AC),認真準備這個比賽的時間不超過一周,中間還要上課交作業啥的。希望個人的經驗能對后來的同學有所幫助(最開始報名這個比賽是想著能夠在寒假認真提升一下自己的編程能力的(結果還是劃水,在賽前抱的佛腳,感謝我的好舍友在我碰見難題的時候給我幫助!!!!有個大佬舍友人生之幸QWQ
關于藍橋杯:
我之前也考慮過要不要參加這個比賽,主要想著還是比較貴,但是感謝學校給我報銷的機會,當時就想著拿省獎報銷混個獎狀,但是最后又變成了省一才能報銷,所以也有了動力稍微認真準備了一下,比賽題目的確不難,對于巨佬來說不值一提,對我來說算是一個鍛煉的過程吧,報名python是因為python編程相對簡單;這個比賽帶給我了不少東西,在過程中也接觸到了力扣之類的刷題網站,也沒有之前的那種懼怕的感覺了,還帶上了我的舍友一起刷力扣,對我來說也算有收獲
關于考場設備:
因為疫情,官方建議線上,我們學校提供了教室,采取自愿的方式,因為統一地方對我來說比較方便,自己帶電腦機房不提供電腦,我覺得這樣比較方便是因為我可以用自己電腦鍵盤鼠標啥的都比較熟悉,同時可以不用自己準備考試環境,之前不想一個人比就是因為感覺正面背面啥的錄像很麻煩加上找不到空閑教室。如果學校不提供這個環境的聽說寢室也可以,設備這些提前弄好,在正式比前一天考場的wifi還特別差,后面找同學才解決這個問題,這些都是一些需要提前準備的東西。
關于python組準備
除了一些刷題網站外,考前能做一兩次往年的對應考題我覺得就差不多夠了,知道這個比賽會有大題小題,每個題大概多難就差不多了。以往的小題會多一點,聽說今年是因為線上大題變多,這樣也挺好的,因為小題我也不一定能做對,大題多能拉低大題難度(bushi),事實證明我的運氣比較好)
一些小技巧
藍橋杯聽說稱為暴力杯,這一點不假,很多問題可以暴力破解。比賽提供草稿,可以使用電腦自帶計算器和office,小題不要求只是建議代碼解決,那么就拿分直接做出答案也就沒有問題。我在準備的時候也遇到了相似的題,這種題目可以直接被excel或者計算器秒解,也不浪費時間,比如本次第一次裁紙題,找到規律可以節約時間留給后續的題目,一些和時間日期有關的、字符編碼有關的都可以用到。相關的題目我舉兩個比較典型,后續有時間也可以補充一下其他小技巧,網上這類型的博文也很多,感興趣可以了解一些這類小trick:
第幾天
【問題描述】
2000年的1月1日,是那一年的第1天。
那么,2000年的5月4日,是那一年的第幾天?
【答案】
125
excel文本框調成時間模式,一拖就出來了,之前還搞過手算,但都比不上excel。
年號字符
【問題描述】
小明用字母 A對應數字 1,B對應 2,以此類推,用 Z對應 26。
對于 27以上的數字,小明用兩位或更長位的字符串來對應,例如 AA對應27,AB對應28,AZ對應52,LQ對應329。
請問2019對應的字符串是什么?
【答案】(26進制問題)
BYQ(2*26^2+25*26^1+17=2019)
?
?、
本次考題思路分享
(可能存在很多問題,因為比賽以后我就把我沒做出來的題看了一下題解,做出的題和同學探討了一下思路,肯定有很多可以優化的地方,歡迎大家指正)
試題 A: 裁紙刀 本題總分:5 分 【問題描述】 小藍有一個裁紙刀,每次可以將一張紙沿一條直線裁成兩半。 小藍用一張紙打印出兩行三列共 6 個二維碼,至少使用九次裁出來,下圖 給出了一種裁法。在上面的例子中,小藍的打印機沒辦法打印到邊緣,所以邊緣至少要裁 4 次。另外,小藍每次只能裁一張紙,不能重疊或者拼起來裁。 如果小藍要用一張紙打印出 20 行 22 列共 440 個二維碼,他至少需要裁多 少次?
第一題:443,當時應該就是直接通過一些計算得到的,簽到題。長a寬b,周圍需要切4刀,中間需要切a-1刀,剩下需要a*(b-1)刀,那么一共需要a*b+3刀
試題 B: 尋找整數 本題總分:5 分 【問題描述】 有一個不超過 1017 的正整數 n,知道這個數除以 2 至 49 后的余數如下表 所示,求這個正整數最小是多少。
?答案:2022040920220409,這個我沒有做出了,答案很新穎是當天的日期,而且我后面聽說才發現,好像每年他都會出現這種當天考試日期的數字(,我當時暴力肯定解不出來,之前看見一個比較好的做法是根據這50個數字的某個倍數去循環,這個方法是比較聰明而且不會超時的,后面我把那篇文章找出來(一時沒有找到)
試題 C: 質因數個數 本題總分:10 分 【問題描述】 給定正整數 n,請問有多少個質數是 n 的約數。
?
就是先得到小于n的所有素數,然后看能否被n整除,我其實是擔心這個題后面的樣例超時的,不知道有沒有更優化的方法。
import math n = int(input()) result=[] for i in range(2,int(n**(0.5))+1):flag = 1for j in range(2,int(math.sqrt(i)+1)):if i % j == 0:flag = 0breakif flag:result.append(i) yueshu=[] for r in result:if n % r == 0:yueshu.append(r) print(len(yueshu))試題 D: 矩形拼接
?【問題描述】 已知 3 個矩形的大小依次是 a1 × b1, a2 × b2 和 a3 × b3。用這 3 個矩形能拼 出的所有多邊形中,邊數最少可以是多少? 例如用 3 × 2 的矩形(用 A 表示)、4 × 1 的矩形(用 B 表示)和 2 × 4 的矩 形(用 C 表示)可以拼出如下 4 邊形。
?這道題是完全不太懂,希望有懂的同學可以指導一下!~
?
試題 E: 消除游戲在一個字符串 S 中,如果 S i = S i?1 且 S i , S i+1 ,則稱 S i 和 S i+1 為邊緣 字符。如果 S i , S i?1 且 S i = S i+1,則 S i?1 和 S i 也稱為邊緣字符。其它的字符 都不是邊緣字符。 對于一個給定的串 S,一次操作可以一次性刪除該串中的所有邊緣字符 (操作后可能產生新的邊緣字符)。 請問經過 2 64 次操作后,字符串 S 變成了怎樣的字符串,如果結果為空則 輸出 EMPTY。
?
兩個題連著不會,光拿分可以試著輸出EMPYT應該能騙幾分()
?試題 F: 重新排序【問題描述】 給定一個數組 A 和一些查詢 Li , Ri,求數組中第 Li 至第 Ri 個元素之和。 小藍覺得這個問題很無聊,于是他想重新排列一下數組,使得最終每個查 詢結果的和盡可能地大。小藍想知道相比原數組,所有查詢結果的總和最多可 以增加多少?
思路:為了使得最終的結果盡可能的大,就是讓重合的區間內的數盡可能地大,先計算原來的和sumPrime,再計算最大值排在重合區間的和sumNew,最后做差就可以得到增加的大小。
n = int(input()) a = list(map(int,input().split())) # n個整數 m = int(input()) # 查詢數 cha = [] for i in range(m):cha.append(list(map(int,input().split()))) sumPrime = 0 times=[0]*n for ii in cha:l,r = iil=l-1r=r-1for i in range(l,r+1):sumPrime += a[i]times[i] += 1 # print(sumPrime) a.sort() # 對a進行排序 # 對其中的重復區間進行統計 times.sort() sumNew=0 for i in range(n):sumNew += times[i]*a[i] # print(sumNew) print(sumNew-sumPrime)?
試題 G: 全排列的價值【問題描述】 對于一個排列 A = (a1, a2, · · · , an),定義價值 ci 為 a1 至 ai?1 中小于 ai 的數 的個數,即 bi = |{aj | j < i, aj < ai}|。定義 A 的價值為 ∑n i=1 ci。 給定 n,求 1 至 n 的全排列中所有排列的價值之和。
?
?思路:這道題我是找規律得到的,當時我羅列了一下3、4、5三個數的結果(花了不少時間),發現答案應該是((n-1)*n)/2 *? n! /2,應該是有對稱的規律,所以讓我想到了累加和和階乘
比如3就是3×2/2×3!/2=9,4就是4×3/2×4!/2=72,5就是10(1-4的和)×5!/2=600
# 得到排列數*中間的值 n = int(input()) sum = 0 for i in range(n):sum+=i mid = sum f = 1 for i in range(3,n+1):f *= i a = mid * f # 3 * 3 # 6 * 12 (4*3) # 10 * 60 result = a % 998244353 print(int(result))試題 H: 最長不下降子序列【問題描述】 給定一個長度為 N 的整數序列:A1, A2, · · · , AN。現在你有一次機會,將其 中連續的 K 個數修改成任意一個相同值。請你計算如何修改可以使修改后的數 列的最長不下降子序列最長,請輸出這個最長的長度。 最長不下降子序列是指序列中的一個子序列,子序列中的每個數不小于在 它之前的數。
?思路:是一類叫做最長上升子序列的題,先判斷一下是不是全部上升的序列,如果不是全部上升,那一定現在存在一個最長的上升序列,通過一個數組dp存儲到這個數字的最長子序列長度,如果該數字比之前最長子序列大,那么dp的值就+1,否則就不變,然后找到dp數組第一次出現最大值的地方,通過一個判斷得到結果。想到這個思路是當時看動態規劃的時候,有點類似最小編輯距離,后面再看的時候發現這就是dp中的最長遞增子序列的模板題,也很推薦labuladong的算法網站,如果我早看見這個說不定當時就基本不用動腦子了(動態規劃設計:最長遞增子序列 :: labuladong的算法小抄
n,k = list(map(int,input().split())) a = list(map(int,input().split())) # print(n,k) # print(a) dp=[1]*n dp[0]=1 for i in range(1,n):for j in range(i):temp = 0if a[i]>a[j]:temp=dp[j]+1if temp>dp[i]:dp[i]=temp result=1 l=0 r=0 #print(dp) if max(dp)==n:result=n else:r = n-1-dp.index(max(dp))l = dp.index(max(dp))-max(dp)+1m = max(l,r)if m >= k:result = max(dp)+kelif m < k:result = max(dp)+m # print(l) # print(r) print(result)試題 I: 最優清零方案【問題描述】 給定一個長度為 N 的數列 A1, A2, · · · , AN。現在小藍想通過若干次操作將 這個數列中每個數字清零。 每次操作小藍可以選擇以下兩種之一: 1. 選擇一個大于 0 的整數,將它減去 1; 2. 選擇連續 K 個大于 0 的整數,將它們各減去 1。 小藍最少經過幾次操作可以將整個數列清零?
貪婪算法,由于最少多少次,所以優先選取第二個動作,從”連續k個值“的k開始循環到n,找出k個小區間終得最小值m,說明這個區間只能有m次連續區間的減法操作。循環到最后,剩下的值只能通過動作1減去,因此就可以得到答案。
n,k=list(map(int,input().split())) a =list(map(int,input().split())) s=sum(a) for i in range(k,n+1):news=a[i-k:i]m =min(news)for j in range(i-k,i):a[j] -= ms -= m*(k-1) print(s)?試題 J: 數的拆分【問題描述】 給定 T 個正整數 ai,分別問每個 ai 能否表示為 x y1 1 · x y2 2 的形式,其中 x1, x2 為正整數,y1, y2 為大于等于 2 的正整數。
?第三個沒做出來的題,好像是和數論有關,這個題我后面把我看見那篇比較好的思路加進來。
轉眼也寫完了,還有很多坑沒填,想到什么沒寫的心得會再補充,請大家不吝賜教!
總結
以上是生活随笔為你收集整理的第十三届蓝桥杯A组Python组心得分享的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Pr:视频效果( 2020 版)速览
- 下一篇: PX4姿态解算磁偏补偿