Python練習(21) 分糖果 中

2021-08-29 05:31:52 字數 1589 閱讀 8633

10個小孩圍城一圈分糖果,老師分給第1個小孩10塊,第2個小孩2塊,第3個小孩8塊,第4個小孩22塊,第5個小孩16塊,第6個小孩4塊,第7個小孩10塊,第8個小孩6塊,第9個小孩14塊,第10個小孩20塊。然後所有的小孩同時將手中的糖分一半給右邊的小孩;糖塊數為奇數的人可向老師要一塊。

問經過這樣幾次後大家手中的糖的塊數一樣多? 每人各有多少塊糖?

分析:

首先,糖的傳遞a[i]=(a[i]+a[i-1])/2,要用到小索引元素,所以應該從大到小遍歷,記得每次迴圈前先取出a[9],最後加到a[0]

判斷是否是奇數

構造全相等的判斷函式

#構造糖塊全相等的判斷函式

def isequal(c):

for v in range(len(c)-1):

if c[v]!=sum(c)/len(c):

return false

#主體函式

a=[10,2,8,22,16,4,10,6,14,20]

k=1while k < 100:

last=a[9]

a[0]=(a[0]+last)/2

if a[0]%2!=0:

a[0]=a[0]+1

for i in range(9,0,-1):

a[i]=(a[i]+a[i-1])/2

#此處在迴圈內直接判斷是否是奇數。如果再來乙個迴圈的話for i in range(10),複雜度大大增加。

if a[i]%2!=0:

a[i]=a[i]+1

k+=1

if isequal(a):

continue

print k,a

執行後出現以上結果,為什麼k的返回值是100?難道都遍歷了?找了一晚上的錯誤,才發現,原來是判斷函式出錯了。這樣的判斷函式,只要列表裡面有乙個平均數,則會輸出true,所以並不能判定所有元素相等。所以即便k會一直迴圈下去,如下

修改判斷函式:

#構造糖塊全相等的判斷函式

def isequal(c):

s=0for v in range(len(c)-1):

if c[v]!=sum(c)/len(c):

s+=1

if s==0:

return true

這樣執行結果才正確,break才起作用

總結:

1 判斷函式構造錯誤

2 判斷是否是奇數的時候,我開始用的是重新遍歷一遍for i in range(10),複雜度大大增加,優化為在迴圈內直接判斷。

3 開始將a[0]的賦值錯誤地放到了for i 迴圈裡面了,這樣每次a[0]都被累加賦值了,應該是外面,每次大迴圈賦值一次

4 平均數array.mean()只有在numpy陣列才能用

修改,找錯誤,查詢,反反覆覆做了兩個小時╮(╯▽╰)╭ 但還是做出來了,還想到了演算法優化減少時間複雜度,進步!

Python 練習例項21

題目21 猴子吃桃問題 猴子第一天摘下若干個桃子,當即吃了一半,還不癮,又多吃了乙個第二天早上又將剩下的桃子吃掉一半,又多吃了乙個。以後每天早上都吃了前一天剩下的一半零乙個。到第10天早上想再吃時,見只剩下乙個桃子了。求第一天共摘了多少。我把問題從猴子吃了多少桃子方向想起,結果複雜化了,越想越亂,於...

python分糖果 Python 貪心的分發糖果

問題描述 分發糖果 力扣135 老師想給孩子們分發糖果,有n個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。你需要按照以下要求,幫助老師給這些孩子分發糖果 每個孩子至少分配到 1 個糖果。相鄰的孩子中,評分高的孩子必須獲得更多的糖果。那麼這樣下來,老師至少需要準備多少顆糖果呢?示例 ...

21 Python100例基礎練習(5)

例21 題目 猴子吃桃問題 猴子第一天摘下若干個桃子,當即吃了一半,還不癮,又多吃了乙個第二天早上又將剩下的桃子吃掉一半,又多吃了乙個。以後每天早上都吃了前一天剩下的一半零乙個。到第10天早上想再吃時,見只剩下乙個桃子了。求第一天共摘了多少。方法 x 1 for day in range 1,10 ...