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