Memikirkan ini sebagai masalah pohon adalah herring merah, itu benar-benar grafik terarah. Tapi lupakan semua itu.
Pikirkan gelas di mana saja di bawah yang atas. Ini akan memiliki satu atau dua gelas di atasnya yang dapat meluap ke dalamnya. Dengan pilihan sistem koordinat yang tepat (jangan khawatir, lihat bagian akhir) kita dapat menulis fungsi untuk mendapatkan kacamata "induk" untuk setiap gelas yang diberikan.
Sekarang kita dapat memikirkan algoritma untuk mendapatkan jumlah cairan yang dituangkan ke dalam gelas, terlepas dari luapan dari gelas itu. Namun jawabannya adalah banyak cairan dituangkan ke masing-masing orangtua dikurangi jumlah yang disimpan dalam setiap gelas orangtua, dibagi dengan 2. Hanya jumlah itu untuk semua orangtua. Menulis ini sebagai fragmen python dari tubuh fungsi number_poured_into ():
# p is coords of the current glass
amount_in = 0
for pp in parents(p):
amount_in += max((amount_poured_into(total, pp) - 1.0)/2, 0)
Maks () adalah untuk memastikan kami tidak mendapatkan jumlah luapan negatif.
Kami hampir selesai! Kami memilih sistem koordinat dengan 'y' di bawah halaman, gelas baris pertama adalah 0, baris kedua adalah 1, dll. Koordinat 'x' memiliki angka nol di bawah kaca baris atas dan baris kedua memiliki koordinat x -1 dan +1, baris ketiga -2, 0, +2, dan seterusnya. Poin penting adalah bahwa gelas paling kiri atau paling kanan di level y akan memiliki abs (x) = y.
Membungkus semua itu menjadi python (2.x), kita memiliki:
def parents(p):
"""Get parents of glass at p"""
(x, y) = p
py = y - 1 # parent y
ppx = x + 1 # right parent x
pmx = x - 1 # left parent x
if abs(ppx) > py:
return ((pmx,py),)
if abs(pmx) > py:
return ((ppx,py),)
return ((pmx,py), (ppx,py))
def amount_poured_into(total, p):
"""Amount of fluid poured into glass 'p'"""
(x, y) = p
if y == 0: # ie, is this the top glass?
return total
amount_in = 0
for pp in parents(p):
amount_in += max((amount_poured_into(total, pp) - 1.0)/2, 0)
return amount_in
def amount_in(total, p):
"""Amount of fluid left in glass p"""
return min(amount_poured_into(total, p), 1)
Jadi untuk mendapatkan jumlah sebenarnya dalam gelas di p, gunakan jumlah_in (total, p).
Tidak jelas dari OP, tetapi sedikit tentang "Anda tidak dapat menambahkan parameter" mungkin berarti pertanyaan asli harus dijawab dalam hal nomor kaca yang ditampilkan. Ini diselesaikan dengan menulis fungsi pemetaan dari nomor kaca pertunjukan ke sistem koordinat internal yang digunakan di atas. Itu fiddly, tetapi solusi iteratif atau matematis dapat digunakan. Fungsi iteratif yang mudah dipahami:
def p_from_n(n):
"""Get internal coords from glass 'number'"""
for (y, width) in enumerate(xrange(1, n+1)):
if n > width:
n -= width
else:
x = -y + 2*(n-1)
return (x, y)
Sekarang cukup tulis ulang fungsi number_in () di atas untuk menerima nomor gelas:
def amount_in(total, n):
"""Amount of fluid left in glass number n"""
p = p_from_n(n)
return min(amount_poured_into(total, p), 1)