柚子快報邀請碼778899分享:職場和發(fā)展 菜鳥藍(lán)橋杯基礎(chǔ)
還有兩天就是藍(lán)橋杯的省賽了,我深知自己有很大概率是拿不了獎的,因為突擊一個月,連語法也不怎么熟練,說好連續(xù)做一個月,期間一個星期又去參加了計算機(jī)設(shè)計大賽(大三學(xué)生的慌不擇路,哈哈哈!)emm還是在最后兩天的時間來總結(jié)一下,畢竟這也是一個非常不自律的人難得堅持了一個月的事情,不管拿不拿獎,都是有所收獲的。
有那么幾次絞盡腦汁地思考,發(fā)現(xiàn)編程真是一件苦中作樂的事情。前幾天是真的毫無頭緒,記得是區(qū)間前綴和那道題,哇做的我覺得自己好孤獨,開始問文心一言為什么編程那么難,哈哈
后來在b站上看了一些大佬們的經(jīng)驗,他們會花幾天的時間去琢磨一道題,我得出的結(jié)論就是天才之所以是天才,因為他們享受普通人不愿意承受的所謂的痛苦。
我感覺做這種編程題連著一個星期一個月,日積月累的,腦袋的溝壑都會變深的。
我終于敢于承認(rèn)自己的缺點了,我害怕思考,我害怕思考后的失敗,這可能就是最大的收獲吧!
沒事,繼續(xù)加油!人總是要向前看的!
1、題庫2122
0數(shù)位排序 - 藍(lán)橋云課 (lanqiao.cn)
#方法一:
n=int(input())
m=int(input())
#定義數(shù)組a 在這里預(yù)先添加一個元素 目的是在最后輸出時第m個元素時,只需要找下標(biāo)為m即可
a=[[0,0]]
def func(x):
sums=0
while x:
sums+=x%10
x=x//10
return sums
for i in range(1,n+1):
#注意,在這里使用數(shù)組的append方法,因為數(shù)組a已經(jīng)初始化過了,不能寫成a[i]=...
a.append([func(i),i])
a.sort()
print(a[m][1])
#方法二:
n=int(input())
m=int(input())
a=list(range(1,n+1))
a.sort(key=lambda x:sum(int(i) for i in str(x)))
#lambda函數(shù)作為參數(shù)傳遞給了key參數(shù)
#含義:key的意思是利用key對數(shù)組排序,lambda是匿名函數(shù),x是參數(shù),來自數(shù)組a,:后面是函數(shù)表達(dá)式
#還有這個sum也很奇怪,背后原理是什么,算了,先記住吧
#等級比我高的一句代碼解決了,等級比我低的也一句代碼解決了,這個本質(zhì)思維就不太一樣。
#哈哈,沒什么挫敗感,起碼我現(xiàn)在學(xué)會了這種方法不是
print(a[m-1])
2、99(二分問題)
0分巧克力 - 藍(lán)橋云課 (lanqiao.cn)
#二分法使用的前提是區(qū)間具有單調(diào)性
#此問題滿足嗎?滿足,當(dāng)巧克力塊邊長越大,塊數(shù)越小
n,k=map(int,input().split())
a=[]
for i in range(n):
#這里的a列表,所添加的必須是列表(列表的嵌套),如果不add列表
#就會導(dǎo)致check對a遍歷時沒有足夠的值去提取
a.append(list(map(int,input().split())))
def check(x):
#判斷中點mid是否合法
cnt=0
#記錄在切割邊長為x的情況下,總的被切割出的巧克力的個數(shù)。
for h,w in a:
cnt+=(h//x)*(w//x)
return cnt>=k
i,j=1,10**5
while i<=j:
mid=(i+j)//2
if check(mid):
i=mid+1
ans=mid
else:
j=mid-1
#二分查找的時間復(fù)雜度為log(n)
print(ans)
3、跳石頭
0跳石頭 - 藍(lán)橋云課 (lanqiao.cn)
L,N,M=map(int,input().split())
a=[]
for i in range(N):
a.append(int(input()))
l,r=0,L
#在這里設(shè)置區(qū)間時,我根據(jù)題目給的L范圍直接給r賦值為10**9,這范圍一下子就超了,直接設(shè)置成L不就得了
def check(mid):
cnt=0
last=0
#cnt為移除的石頭數(shù)量,last為移除石頭后上一個石頭的位置
for i in a:
if i-last>=mid:
#在這里,必須寫成大于等于,不然就不能通過,因為mid為猜測的最短跳躍距離,要包含mid
last=i
else:
cnt+=1
if L-last #這里還有一個需要滿足的特殊條件,因為起點和終點不包含在L里面,要對終點和last之間的距離進(jìn)行判斷 return False return cnt<=M #以下為一個標(biāo)準(zhǔn)二分的寫法 while l<=r: mid=(l+r)//2 if check(mid): ans=mid l=mid+1 else: r=mid-1 4、題庫97 16.k倍區(qū)間 - 藍(lán)橋云課 (lanqiao.cn) #這道題有點涉及到動態(tài)規(guī)劃,利用子問題的解來求解原問題 N,K=map(int,input().split()) a=[0] #設(shè)定初始值,方便對前綴和進(jìn)行計算 dp={0:1} #起初對這個dp設(shè)置初始值很不理解 #首先要理解dp的含義,dp的key的意思是余數(shù)值,dp的value意思是余數(shù)為key的個數(shù) #那么dp{0:1}的意思就是余數(shù)為0的個數(shù)最初就設(shè)為1,代表原始前綴和本身構(gòu)成K倍區(qū)間的個數(shù)為1 ans=0 for i in range(1,N+1): a.append(a[i-1]+int(input())) mod=a[i]%K ans+=dp.get(mod,0) dp[mod]=dp.get(mod,0)+1 #這里的dp[mod]為在原字典中有可能不存在,注意不能寫成dp[mod]+=1,而要寫成上面語句這種形式 print(ans) 5、題庫4125 0雞哥的奇特密碼 - 藍(lán)橋云課 (lanqiao.cn) i=0 s=list(input()) while i<(len(s)-1): if s[i]=='L' and s[i+1]=='L': del s[i+1] else: i+=1 ''' 這道簡單的題對我來說太困難了 首先我把循環(huán)寫成for循環(huán)了,for循環(huán)是自動給i+1的,導(dǎo)致結(jié)果出錯 for和while的區(qū)別在于for事先已經(jīng)確定了循環(huán)的次數(shù),while不是;并且for循環(huán)的迭代變量是自動定義的,while需要在循環(huán)前定義 其次我改成while以后,把i的范圍寫成了i ''' print("".join(s)) s=input() w=s[0] for i in s: if w[-1]==i=='L': pass else: w+=i #字符串添加元素用+ print(w) 6、4124 0分糖果 - 藍(lán)橋云課 (lanqiao.cn) #利用dfs搜索 ans=0 def dfs(depth,n,m): #參數(shù)depth為搜索的層數(shù),n為第一種糖果剩余的數(shù)量,m為第二種糖果剩余的數(shù)量 global ans if depth==7:#七個小朋友則設(shè)置七層 if n==0 and m==0: ans+=1 return for i in range(0,6):#每個小朋友得到的每種糖果最小為0最大為5 for j in range(0,6): if 2<=i+j<=5: dfs(depth+1,n-i,m-j) dfs(0,9,16) print(ans) 7、1372 0美麗的區(qū)間 - 藍(lán)橋云課 (lanqiao.cn) #利用雙指針求解 n,s=map(int,input().split()) a=list(map(int,input().split())) l,r=0,0 #這里的l,r都必須設(shè)置成0,屬于同向指針 add=0 ans=n+1 #把a(bǔ)ns設(shè)置成不可能的值,是為了比較出最小的區(qū)間 while l while r #還有這里的條件,與條件,一個不成立就跳出循環(huán) add+=a[r] r+=1 #當(dāng)滿足add大于等于s時 if add>=s: ans=min(ans,r-l) add-=a[l] #在指針l變換之前,要先把l~r的和減去a[l] l+=1 if ans==n+1: #這個條件不能忘了 ans=0 print(ans) 8、0挑選子串 - 藍(lán)橋云課 (lanqiao.cn) #什么問題可以利用雙指針解決? #滑動窗口,始終維護(hù)一個區(qū)間 n,m,k=map(int,input().split()) a=list(map(int,input().split())) l,r=0,0 ans,cnt=0,0 while l while r if a[r]>=m: cnt+=1 r+=1 if cnt>=k: ans+=(n-1)+(r-2) if a[l]>=m: cnt-=1 l+=1 print(ans) 9、532(同向指針問題) 0紀(jì)念品分組 - 藍(lán)橋云課 (lanqiao.cn) w=int(input()) n=int(input()) a=[] for i in range(n): a.append(int(input())) a.sort() cnt=0 l,r=0,n-1 while l<=r: if l==r: #注意這個特殊控制條件,一旦滿足就需要跳出循環(huán),不然會執(zhí)行接下來的步驟 cnt+=1 break if a[l]+a[r]<=w: cnt+=1 l+=1 r-=1 else: cnt+=1 r-=1 print(cnt) 10、題庫209(貪心) 什么時候用到貪心?只考慮當(dāng)前最優(yōu)也能達(dá)到全局最優(yōu)的情況 0翻硬幣 - 藍(lán)橋云課 (lanqiao.cn) s1=list(input()) s2=list(input()) cnt=0 for i in range(len(s1)-1): if s1[i]!=s2[i]: cnt+=1 s1[i]=s2[i] s1[i+1]='*' if s1[i+1]=='o' else 'o' #這里可以記一下,一種便捷的判斷,python可真是順應(yīng)人性 print(cnt) 11、1447(我還沒搞懂動態(tài)規(guī)劃的做法) 0砝碼稱重 - 藍(lán)橋云課 (lanqiao.cn) n=int(input()) a=list(map(int,input().split())) s=set() #定義一個集合,利用了集合內(nèi)元素不重復(fù)的特性 s.add(0) #添加0考慮了單個砝碼的情況 for i in a: for j in list(s): s.add(i+j) s.add(abs(i-j)) #用這個絕對值很方便啊,不用判斷i,j的大小 print(len(s)-1) #最后把0取掉 12、1259 0奇怪的捐贈 - 藍(lán)橋云課 (lanqiao.cn) n=1000000 cnt=0 for i in range(7,-1,-1): #一百萬不能剩余,所以要反向循環(huán)。 #range的范圍可以自己求出,7**7是八十五萬,所以從7開始,大于七也行。 for j in range(5): if (n-7**i)>=0: n=n-7**i cnt+=1 else: break print(cnt) 柚子快報邀請碼778899分享:職場和發(fā)展 菜鳥藍(lán)橋杯基礎(chǔ) 文章鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。