ooxx7788 发表于 2017-4-25 19:15:55

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

新手·ing 发表于 2017-4-25 19:35:46

{:10_257:}

新手·ing 发表于 2017-4-25 19:39:15

@冬雪雪冬 @ooxx7788 @gopythoner @lumber2388779
一日多练{:10_257:}

gopythoner 发表于 2017-4-25 20:17:06

本帖最后由 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:23:24

gopythoner 发表于 2017-4-25 20:17
我写了一个,把你上面的测试了,全部正确

我写的这个的原理就是lis = []代表了购票机器里面的钱,一开始是空的
然后根据进入的钱找钱,但是我用的try,因为有可能找不了钱,一旦找钱失败,就得到“no”

当回首遇上转身 发表于 2017-4-26 06:51:14

练练更健康

leaves_cy 发表于 2017-4-26 11:22:47

使用字典存储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"

余欲渔 发表于 2017-4-28 20:33:00

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

willLin 发表于 2017-5-12 14:05:37

向大佬学习

solomonxian 发表于 2017-6-21 18:40:42

本帖最后由 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')
   

renze 发表于 2017-9-19 16:45:58

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('行')

胡先生 发表于 2017-9-20 15:15:32

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'

2740710202 发表于 2017-9-20 16:34:04

张大象 发表于 2017-9-20 17:16:46

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)

朔夜 发表于 2017-10-30 16:42:02

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(",")))

编程新血 发表于 2017-11-26 08:51:47

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:26:25

本帖最后由 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:08:37

本帖最后由 瞬秒爆加速 于 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()

大头目 发表于 2018-4-16 15:09:52

{:10_257:}

tsembrace 发表于 2018-4-16 22:34:33

'''
电影院今天售票员全都放假。只能依靠电影院自动售票机进行购票,单张票价为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())
      
      
页: [1] 2 3
查看完整版本: python:每日一题 33