I start to feed one of the pigeons. A minute later two more fly by and a minute after that another 3. Then 4, and so on (Ex: 1+2+3+4+...). One portion of food lasts a pigeon for a minute, but in case there's not enough food for all the birds, the pigeons who arrived first ate first. Pigeons are hungry animals and eat without knowing when to stop. If I have N portions of bird feed, how many pigeons will be fed with at least one portion of wheat?
pigeons
Input: A quantity of portions wheat as a positive integer.
Output: The number of fed pigeons as an integer.
Example:
?
1
2
3
4
checkio(1) == 1
checkio(2) == 1
checkio(5) == 3
checkio(10) == 6
How it is used: This task illustrates how we can model various situations. Of course, the model has a limited approximation, but often-times we don't need a perfect model.
Precondition: 0 < N < 105.
下面有2中方法,one is ugly while another is elegant
ugly
g_n = 0
def checkio(N):
global g_n
g_n = N
pd = dict()
pd[1] = 1
g_n -= 1
i = 1
while 1:
i += 1
r = eat(pd,i)
if r != -1:
return r
def eat(pd,x):
global g_n
for m in pd:
g_n -= pd[m]
if g_n <= 0:
return cal(pd)
i = 1
while i<=x:
g_n -= 1
if g_n == 0:
pd[x] = i
return cal(pd)
i += 1
if i >= x:
pd[x] = x
return -1
elegant:
def checkio1(food):
#init Minute that is also how many pigeons will show up next minute and total pigeons.
m = t = 0
while 1:
m += 1
food -= t
if food > 0:
temp = min(food,m)
t += temp
food -= temp
else:
return t
.