日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

第十二届蓝桥杯 杨辉三角形 Python题解 满分

發(fā)布時(shí)間:2023/12/31 python 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第十二届蓝桥杯 杨辉三角形 Python题解 满分 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

其實(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)題。

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