蓝桥杯真题 杨辉三角形 python
- 專欄
- 《藍(lán)橋杯題目》
目錄
????????【問(wèn)題描述】
????????【輸入格式】
????????【輸出格式】
????????【樣例輸入】
????????【樣例輸出】
????????【評(píng)測(cè)用例規(guī)模與約定】
??????????省流版本:
??????????題目解析:
??????????綜上所述,寫(xiě)成代碼如下所示:
【問(wèn)題描述】
下面的圖形是著名的楊輝三角形:
如果我們按從上到下、從左到右的順序把所有數(shù)排成一列,可以得到如下數(shù)列:
1, 1, 1, 1, 2, 1, 1, 3, 3, 1, 1, 4, 6, 4, 1, …
給定一個(gè)正整數(shù) N,請(qǐng)你輸出數(shù)列中第一次出現(xiàn) N 是在第幾個(gè)數(shù)?
【輸入格式】
輸入一個(gè)整數(shù) N。
【輸出格式】
輸出一個(gè)整數(shù)代表答案。
【樣例輸入】
6
【樣例輸出】
13
【評(píng)測(cè)用例規(guī)模與約定】
對(duì)于 20% 的評(píng)測(cè)用例,1 ≤ N ≤ 10;
對(duì)于所有評(píng)測(cè)用例,1 ≤ N ≤ 1000000000。
省流版本:
如果直接用暴力枚舉的話,需要求出每一行的全部數(shù)字,然后判斷每一行中是否存在該整數(shù),思路可以,但是時(shí)間復(fù)雜度太大,只能拿30%。如果根據(jù)二項(xiàng)式定理,找出從哪一行開(kāi)始只需要遍歷前三個(gè)數(shù),然后利用求和公式直接計(jì)算答案,就可以大大減少時(shí)間復(fù)雜度。
題目解析:
首先介紹一下楊輝三角的性質(zhì):
1、每個(gè)數(shù)等于它上方兩個(gè)數(shù)的和。
2、左右對(duì)稱(說(shuō)明最先出現(xiàn)的數(shù)一定在左邊)
3、第n行有n個(gè)數(shù),前n行就有(n+1)*n/2個(gè)數(shù)
4、n+1行的數(shù)是(a+b)^n展開(kāi)后各項(xiàng)的系數(shù)
所以,由性質(zhì)4可得,第n行的m個(gè)元素為C(n-1,m-1),由于1 ≤ N ≤ 1000000000,每一行第四個(gè)數(shù)為N*(N-1)*(N-2)/6,粗略計(jì)算,當(dāng)N>1900時(shí),第四項(xiàng)就大于1000000000了,所以說(shuō),從第1901行開(kāi)始,N若是第一次出現(xiàn),只可能出現(xiàn)在第二第三項(xiàng)。
因此,在前1900層時(shí),可以直接使用暴力枚舉,在判斷是否在該層,若不在前面1900層,先粗略估計(jì)N所在的層數(shù)(先計(jì)算在第三項(xiàng)時(shí),因?yàn)槿舸嬖?#xff0c;就會(huì)先出現(xiàn))int((N*2)**0.5),這時(shí),就只需要判斷三種情況:①N在該層;②N在下一層;③N在N+1層。
最后計(jì)算在第幾個(gè)數(shù)上,分為三種情況:
1、在前1900層時(shí),(c*c+c)//2+j+1 ,在c+1層的第j+1個(gè)數(shù)時(shí)(j是在列表中的下表,因此要加1)
2、在1900層之后且是第三項(xiàng)時(shí),(k*(k+1))//2+3,第k+1行
3、在1900層之后且是第二項(xiàng)時(shí),(N*(N+1)//2)+2,第N+1行時(shí)
綜上所述,寫(xiě)成代碼如下所示:
N=int(input()) n=[1] #第一層 c=1 #層數(shù) if N==1:print(1) else:#由于第1900層開(kāi)始,N只會(huì)出現(xiàn)在第二個(gè)或第三數(shù)字上,所以1900開(kāi)始,不需要求全部while c<1900:n = [1]+[n[j]+n[j+1] for j in range(len(n)-1)]+[1] #楊輝三角遞推公式if N not in n[1:len(n)-1]: #判斷N是否在c層上c=c+1else:break if c==1900:k=int((N*2)**0.5) #粗略計(jì)算出現(xiàn)的層數(shù) #N出現(xiàn)在第三個(gè)數(shù)上while (k*(k-1))//2<N:k=k+1if (k*(k-1))//2==N:print((k*(k+1))//2+3)#N出現(xiàn)在第二個(gè)數(shù)上else:print((N*(N+1)//2)+2) # N會(huì)出現(xiàn)在第N+1層 #N在前1900層上時(shí) for j in range(len(n)):if n[j]==N:print(((c*c+c)//2)+j+1) break最后運(yùn)行一下結(jié)果。。。。。
總結(jié)
以上是生活随笔為你收集整理的蓝桥杯真题 杨辉三角形 python的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: comsol频域模拟
- 下一篇: 代码制作数字流星雨_js代码实现流星雨