第十二届蓝桥杯 杨辉三角形 Python题解 满分
前言
其實(shí)道題在寒假的時(shí)候就做了,現(xiàn)在有機(jī)會(huì)發(fā)出來(lái)了。(〃‘▽’〃)
題目
思路
參考了大佬斜行查找的思路,為了便于觀察和敘述,我把楊輝三角形如圖排一下
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 1 10 45 120 210 252 210 120 45 10 1從圖形上看,第一列全都是1,顯然沒(méi)什么查詢的價(jià)值,省略。。
每一行的第一個(gè)也都是1,也沒(méi)什么價(jià)值,省略。。
通過(guò)觀察發(fā)現(xiàn),每個(gè)奇數(shù)行中間的數(shù)都是最大的,也是第一次出現(xiàn)的。也就是說(shuō)從(1,2)開(kāi)始每次坐標(biāo)(+1,+2)上的數(shù)都是最早出現(xiàn)的,比如說(shuō)2,6,20,70…
利用這個(gè)規(guī)律,我們先找到離要查找的數(shù)最近的那一列(差的絕對(duì)值最小 and 小于等于)
我們可以從2這個(gè)數(shù)的坐標(biāo)(1,2)開(kāi)始查找每一列最接近要查找的數(shù)的值,比如要查找21,我們先利用上面那個(gè)規(guī)律查找
首先21>2,坐標(biāo)(+1,+2)來(lái)到(2,4);
21>6,坐標(biāo)(+1,+2)來(lái)到(3,6);
21>20,坐標(biāo)(+1,+2)來(lái)到(4,8);
21<70,不移動(dòng)坐標(biāo)了,鎖定20這個(gè)數(shù)的坐標(biāo)。
然后在20這一列(3,*)開(kāi)始查找21,用二分查找的方法提高速度。突然發(fā)現(xiàn)在這一列中找不到21,只能將坐標(biāo)往前移動(dòng)一列來(lái)到15這個(gè)位置。
為什么不往后移動(dòng)而是往前移動(dòng)呢?是因?yàn)闂钶x三角形的對(duì)稱的特點(diǎn),往后找雖然可能找得到,但是一定不是最早出現(xiàn)的。
往前移動(dòng)一列后,再次利用二分查找,發(fā)現(xiàn)找到了21,而且這 個(gè)21的位置一定是最早出現(xiàn)的。
我這里用排列組合的方法求楊輝三角,就不用每次都把一個(gè)完整的楊輝三角計(jì)算出來(lái)了,最后再用坐標(biāo)求位置
題解
import sys n = int(input()) t = 1#n為1直接出結(jié)果 if n == 1:print(1)sys.exit()#先找到是哪一列比較接近 l = 0 #行 r = 0 #列 while t < n:t = 1l += 2r += 1for i in range(l-r+1,l+1):#排列組合求楊輝三角t *= ifor i in range(2,r+1):t //= i ## print(t)if t == n:print(l*(l+1)//2+r+1)sys.exit() else:l -= 2r -= 1t = 1#再用二分法在豎列中查找 j = l k = n while t != n:l = (j+k)//2t = 1for i in range(l-r+1,l+1):#排列組合求楊輝三角t *= ifor i in range(2,r+1):t //= iif j < k: #二分查找if t > n:k = l - 1elif t < n:j = l + 1elif t == n: #找到就退出,以免坐標(biāo)錯(cuò)亂break;else: #這里是該列找不到,就往前一列找r -= 1k = n ## print(t)print(l*(l+1)//2+r+1) #利用坐標(biāo)求位置總結(jié)
以上是生活随笔為你收集整理的第十二届蓝桥杯 杨辉三角形 Python题解 满分的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 自动脚本 android,原神自动脚本全
- 下一篇: 蓝桥杯 杨辉三角形 python组省赛真