python:每日一题 33
本帖最后由 ooxx7788 于 2017-4-26 14:10 编辑该死的电影院今天售票员全都放假。只能依靠电影院自动售票机进行购票,单张票价为25元。而售票机内没有钱,因此只能靠收入的钱去找零。售票机只能单张销售。(这电影院为什么不倒闭算了。)
现有的货币面值为100,50,25三种。现在有n个人需要买票,且排队顺序不许变,请你根据他们手中的钱计算出,售票机能否进行找零。可以则返回yes,不可以则返回no
def tickets(people):
# your code
return ?
例:
tickets() --->'yes'
tickets()--->'yes'
tickets()--->'no'
tickets()--->'no'
tickets() --->'no'
print(tickets())--->'no' # 由于排队数序不许变,这个本可以交易的组合无法进行交易。
给出一段测试代码,避免你们自己去兑答案了。
以下代码保存为test.py,后import可用
def assert_equals(func, target):
if func == target:
print('Success!')
else:
print('Fail!{0} not equals {1}'.format(func, target))
test.assert_equals(tickets(), 'YES')
test.assert_equals(tickets(), 'NO')
test.assert_equals(tickets(), 'YES')
test.assert_equals(tickets(), 'NO')
test.assert_equals(tickets(), 'NO')
test.assert_equals(tickets(), 'YES')
test.assert_equals(tickets(), 'NO')
test.assert_equals(tickets(), 'NO')
test.assert_equals(tickets(), 'YES')
test.assert_equals(tickets(),'NO')
test.assert_equals(tickets(), 'NO')
test.assert_equals(tickets(), 'NO')
test.assert_equals(tickets(), 'NO')
test.assert_equals(tickets(), 'NO')
test.assert_equals(tickets(), 'NO')
好了,下面是我的答案,但是我也不保证对,只是以上测试能通过。
**** Hidden Message ***** {:10_257:} @冬雪雪冬 @ooxx7788 @gopythoner @lumber2388779
一日多练{:10_257:} 本帖最后由 gopythoner 于 2017-4-25 20:21 编辑
我写了一个,把你上面的测试了,全部正确
def tickets(nums):
lis = []
try:
for money in nums:
if money == 25:
lis.append(money)
elif money ==50:
lis.append(50)
lis.remove(25)
else:
lis.append(100)
try:
lis.remove(25)
lis.remove(50)
except:
lis.remove(25)
lis.remove(25)
lis.remove(25)
return "yes"
except:
return "no" gopythoner 发表于 2017-4-25 20:17
我写了一个,把你上面的测试了,全部正确
我写的这个的原理就是lis = []代表了购票机器里面的钱,一开始是空的
然后根据进入的钱找钱,但是我用的try,因为有可能找不了钱,一旦找钱失败,就得到“no” 练练更健康 使用字典存储25和50的个数,每次在找零钱时只需要判断25和50的组合是否够用即可。
def tickets(people):
dict = {25: 0, 50: 0}
for money in people:
#print (dict)
if money == 25:
dict += 1
elif money == 50:
if dict > 0:
dict -= 1
dict += 1
else:
return "No"
elif money == 100:
if dict > 0 and dict > 0 :
dict -= 1
dict -= 1
elif dict > 2:
dict -= 3
else:
return "No"
return "Yes" sx=
def tick(aa=):
a=0
b=0
while aa!=[]:
if aa==25:
a+=1
elif aa==50:
a-=1
b+=1
else:
if b>0:
b-=1
a-=1
else:
a-=3
if a<0:
return 'NO'
aa=aa
return 'YES'
print(tick(sx)) 向大佬学习
本帖最后由 solomonxian 于 2017-6-21 18:42 编辑
把整个操作过程写下来了,感觉直接找几个赋值代替要方便多了,不过这样直观方便阅读也ok吧
# 用列表来存储收入的 25和50 两种面额,找零时删除,当列表不足够找零时break
def tickets(p):
"""传入排队人员钞票面值列表 p(25,50,100 三种面值),判断能否成功找零"""
saves = []
for i in p:
if i == 25:
saves.append(i)
elif i == 50 and saves.count(25):
saves.remove(25)
saves.append(50)
elif i == 100 and saves.count(50) and saves.count(25):
saves.remove(50)
saves.remove(25)
elif i == 100 and saves.count(25)>=3:
for j in range(3):
saves.remove(25)
else:
break
else:
print('yes')
return
print('no')
list_q =
num_25 = 0
for i in range(len(list_q)):
if list_q == 25 :
num_25 += 1
elif list_q == 50 :
num_25 -= 2
elif list_q == 100 :
num_25 -= 3
ifnum_25 < 0 :
print('不行')
else:
print('行') def Cinema_ticket2(list):
machine = []#机器里面的钱
zhaolings = [] #排队的每个人的找零情况
zhaoling=0
for l in list:#循环所有排队的人
if l == 25: #25的时候直接加入machine,并标记为yes
zhaolings.append('yes')
machine.append(l)
elif l == 50: #50的时候 判断machine里面是否有25块钱面值的存在
zhaoling = l-25
if zhaoling in machine: #存在则加入machine ,标记为yes,并且找零
zhaolings.append('yes')
machine.append(l)
machine.remove(zhaoling)
else: #不存在标记为no
zhaolings.append('no')
elif l == 100:
if 50 in machine: #存在50的就判断还有没有25的
if 25 in machine: #有25的就加入machine ,标记为yes,并且找零
machine.append(l)
machine.remove(50)
machine.remove(25)
else: #只有50没有25的就标记为no
zhaolings.append('no')
elif 25 in machine: #只存在25的就判断有没有3个25的
count = machine.count(25) #判断25的个数
if count>2 :
zhaolings.append('yes')
else:
zhaolings.append('no')
else: #既没有50的也没有25的,就标记为
zhaolings.append('no')
print (zhaolings)
if 'no' in zhaolings:
return 'no'
else:
return 'yes' 的 def tickets(people):
try:
if people == 25:
for i in people:
if i == 25:
continue
elif i == 50:
people.remove(25)
else:
if 50 in people:
people.remove(50)
people.remove(25)
else:
people.remove(25)
people.remove(25)
people.remove(25)
else:
return 'NO'
except:
return 'NO'
return 'YES'
a = tickets()
b = tickets()
print(a,b) def fun(temp):
dic={}
for item in temp:
if int(item)== 25 and item in dic:
dic+=1
if int(item)==25 and item not in dic:
dic=1
if int(item)==50 and item in dic:
if dic>=1:
dic+=1
dic-=1
else:
break
if int(item)==50 and item not in dic:
if dic>=1:
dic=1
dic-=1
else:
break
if int (item)==100 and item in dic:
if (dic>=1 and dic>=1) or dic>=3:
dic+=1
if dic>=1:
dic-=1
dic-=1
dic+=1
else:
dic=dic-3
dic+=1
else:
break
if int (item)==100 and item not in dic:
if (dic>=1 and dic>=1) or dic>=3:
dic=1
if dic>=1:
dic-=1
dic-=1
dic=1
else:
dic=dic-3
dic=1
else:
break
print(dic)
if __name__=='__main__':
temp=input("请输入一组数据")
fun(list(temp.split(","))) def tickets(people):
s25=0
s50=0
s100=0
##100找75,为50,25各1或者25*3
##50找25
y='yes'
while people:
i=people.pop(0)
if i==25:
s25+=1
elif i==50 and s25>=1:
s25-=1
s50+=1
elif i==100 and s50>=1 and s25>=1:
s50-=1
s25-=1
s100+=1
elif i==100 and s25>=3:
s25-=3
s100+=1
else:
y='No'
break
return y
su=
print(tickets(su))
其针对100元优先使用50+25的找钱组合,当不满足50+25组合时,使用25*3的组合,
貌似不智能,我也就这水平了...... 本帖最后由 shigure_takimi 于 2017-12-1 21:51 编辑
def assert_equals(func, target):
if func == target:
print('Success!')
else:
print('Fail!{0} not equals {1}'.format(func, target))
def tickets(people):
cinema = []# 存储影院收的钱
for i in people:
cinema.append(i)# 收钱
if not (i == 25 or\
(i == 100 and (cinema.count(25) >= 3 or (25 in cinema and 50 in cinema))) or\
(i == 50 and 25 in cinema)):
# 如果不是以下三种情况,则返回'NO':
# 1.排队的人拿出100元,而影院有25*3或25+50的组合;
# 2.排队的人拿出50元,而影院有25的可以找零;
# 3.排队的人拿出的是25元的。
# 找不开,退钱
cinema.remove(i)
return 'NO'
else: # 可以找零
if i == 100: # 对100的优先找50+25,如果不行则找25*3
if 50 in cinema:
cinema.remove(25)
cinema.remove(50)
else:
cinema.remove(25)
cinema.remove(25)
cinema.remove(25)
elif i == 50: # 对50的找零25
cinema.remove(25)
return 'YES'
assert_equals(tickets(), 'YES')
assert_equals(tickets(), 'NO')
assert_equals(tickets(), 'YES')
assert_equals(tickets(), 'NO')
assert_equals(tickets(), 'NO')
assert_equals(tickets(), 'YES')
assert_equals(tickets(), 'NO')
assert_equals(tickets(), 'NO')
assert_equals(tickets(), 'YES')
assert_equals(tickets(),'NO')
assert_equals(tickets(), 'NO')
assert_equals(tickets(), 'NO')
assert_equals(tickets(), 'NO')
assert_equals(tickets(), 'NO')
assert_equals(tickets(), 'NO')
# 全部成功了。不过看了下别人的答案,楼上leaves_cy的用字典的方式比较好,也容易懂。
>>>
Success!
Success!
Success!
Success!
Success!
Success!
Success!
Success!
Success!
Success!
Success!
Success!
Success!
Success!
Success! 本帖最后由 瞬秒爆加速 于 2018-3-12 14:12 编辑
def tickets(people):
s = 0
for i in people:
if s>=(i-25):
s= s-i+50
else:
return 'NO'
break
else:
retrun 'YES'
if __name__=="__main__":
tickets()
tickets()
tickets()
tickets()
tickets()
tickets()
tickets() {:10_257:} '''
电影院今天售票员全都放假。只能依靠电影院自动售票机进行购票,单张票价为25元。
而售票机内没有钱,因此只能靠收入的钱去找零。售票机只能单张销售。
现有的货币面值为100,50,25三种。
现在有n个人需要买票,且排队顺序不许变
请你根据他们手中的钱计算出,售票机能否进行找零。
可以则返回yes,不可以则返回no
'''
import random
def tickets(people):
if people!=25:
return 'no'
else:
tkdc={25:0,50:0,100:0}
for i in range(len(people)):
if people==25:
tkdc+=1
elif people==50:
tkdc+=1
tkdc-=1
elif people==100:
tkdc+=1
tkdc-=1
tkdc-=1
iftkdc<0 or tkdc<0 or tkdc<0:
return 'no'
return 'yes'
rlen=random.randint(2,16)
rmb=
rp=[]
for i in range(1,rlen):
rp.append(random.choice(rmb))
print(rp)
print(tickets(rp))
print(tickets())