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 ...