今天的主要思路是优化昨天两道题的代码,减少冗余的list和减少for循环的次数;
1、电影院买票问题
问题:2n个人排队进电影院,票价是50元。在这2n个人当中,其中n个人只有50元,另外n个人只有100元面钞。愚蠢的电影院开始卖票时1分钱也没有。问:有多少种排队方法使得每当一个拥有100元面钞的人买票时,电影院都有50元找钱?
思路:本次代码优化了itertools.permutations()函数处用枚举排列的形式产生了大量重复的排列组合;
代码:
import itertools
x=50
y=100
n=5
list_fifty=[]
list_hundred=[]
list_final=[]
for i in range(1,n+1):
list_fifty.append(x)
for i in range(1,n+1):
list_hundred.append(y)
list_combine=list_fifty+list_hundred
list_givend=[]
list_last=[]
for p in itertools.permutations(list_combine,2*n):
list_p=list(p)
if list_p not in list_final:
list_final.append(list_p)##把排列组合的元素去重写入
for i in range(len(list_final)):
if list(list_final[i])[0]==50:###判断每个排列组合的第一个元素是不是50,如果不是50就剔除
con_list=list(list_final[i])
for i in range(2*n):
if con_list[0:i+1].count(50)<con_list[0:i+1].count(100):#每个位数递增看50的个数会不会比100的个数大,如50的个数比100的个数少,就break
break
elif con_list[0:i+1].count(50)>=con_list[0:i+1].count(100)and i==len(con_list)-1:#如50的个数大于等于100的个数,且循环到头了,就打印出来
list_givend.append(con_list) #把元素写入到数组中
print('最终的排列组合有',len(list_givend),'种,分别是',list_givend)
2、说谎推理题
问题:A、B、C、D、E五位同学各自从不同的途径打听到获得通讯赛第一名的同学的情况:
A:姓李,女同学,年龄13,广东人
B:姓张,男同学,年龄11,湖南人
C:姓陈,女同学,年龄13,广东人
D:姓黄,男同学,年龄11,广西人
E:姓张,男同学,年龄12,广东人
实际上,获得第一名的同学姓什么,性别,年龄,哪里人这四项情况在表中已有,但五位同学所打听到的情况,每人仅有一项是正确的。
请根据此推断获得第一名的同学的情况。
思路:本次代码着重在把20个循环改成4个循环;
代码:
first=['姓李','女性','13岁','广东人']
second=['姓张','男性','11岁','湖南人']
third=['姓陈','女性','13岁','广东人']
fourth=['姓黄','男性','11岁','广西人']
fifth=['姓张','男性','12岁','广东人']
mix=first+second+third+fourth+fifth
def compare(combine,assumption):
count=len(list(set(combine).intersection(set(assumption))))#取两个list的相等的元素
return count
name=['姓李','姓张','姓陈','姓黄']
sex=['女性','男性']
age=['13岁','11岁','12岁']
province=['广东人','湖南人','广西人']
for a in name:
for b in sex:
for c in age:
for d in province:
str_combine=str(a)+','+str(b)+','+str(c)+','+str(d)
combine= str_combine.split(',')
result1=compare(combine,first)
result2=compare(combine,second)
result3=compare(combine,third)
result4=compare(combine,fourth)
result5=compare(combine,fifth)
if result1==1 and result2==1 and result3==1 and result4==1 and result5==1:
print(combine)
网友评论