日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

蓝桥杯真题 杨辉三角形 python

發(fā)布時(shí)間:2023/12/31 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 蓝桥杯真题 杨辉三角形 python 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
  • 專欄
  • 《藍(lán)橋杯題目》

目錄

????????【問題描述】

????????【輸入格式】

????????【輸出格式】

????????【樣例輸入】

????????【樣例輸出】

????????【評(píng)測用例規(guī)模與約定】

??????????省流版本:

??????????題目解析:

??????????綜上所述,寫成代碼如下所示:


【問題描述】

下面的圖形是著名的楊輝三角形:

如果我們按從上到下、從左到右的順序把所有數(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)測用例規(guī)模與約定】

對(duì)于 20% 的評(píng)測用例,1 ≤ N ≤ 10;

對(duì)于所有評(píng)測用例,1 ≤ N ≤ 1000000000。

省流版本:

如果直接用暴力枚舉的話,需要求出每一行的全部數(shù)字,然后判斷每一行中是否存在該整數(shù),思路可以,但是時(shí)間復(fù)雜度太大,只能拿30%。如果根據(jù)二項(xiàng)式定理,找出從哪一行開始只需要遍歷前三個(gè)數(shù),然后利用求和公式直接計(jì)算答案,就可以大大減少時(shí)間復(fù)雜度。

題目解析:

首先介紹一下楊輝三角的性質(zhì):

1、每個(gè)數(shù)等于它上方兩個(gè)數(shù)的和。

2、左右對(duì)稱(說明最先出現(xiàn)的數(shù)一定在左邊)

3、第n行有n個(gè)數(shù),前n行就有(n+1)*n/2個(gè)數(shù)

4、n+1行的數(shù)是(a+b)^n展開后各項(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了,所以說,從第1901行開始,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í)

綜上所述,寫成代碼如下所示:

N=int(input()) n=[1] #第一層 c=1 #層數(shù) if N==1:print(1) else:#由于第1900層開始,N只會(huì)出現(xiàn)在第二個(gè)或第三數(shù)字上,所以1900開始,不需要求全部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的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。