?全排列 itertools中的permutations 做题时要想清楚是排列还是组合
不论是列表还是字符串 调用permutations or combinations 返回每个元素以元组形式存在
import itertools
s=[1,2,3,4,5]
for i in itertools.permutations(s,5):
print(i)
#输出
#(1, 2, 3, 4, 5)
#(1, 2, 3, 5, 4)
#(1, 2, 4, 3, 5)
#(1, 2, 4, 5, 3)....
a="12345"
for i in itertools.permutations(a,5):
print(i)
#输出
#('5', '3', '4', '1', '2')
#('5', '3', '4', '2', '1')
#('5', '4', '1', '2', '3')
#('5', '4', '1', '3', '2')
唯一区别在于 元素的组成部分是数字还是字符串
permutations(combinaitons)(序列,生成元素长度) 如果生成元素长度为序列长度,可以省略。
如何将一个序列作为数字输出?
如果生成的序列都是数字 可以通过循环s=s*10+a[i] 实现
如果生成的序列都是字符串 可以通过int(''.join(序列))
本题关键点在于 通过分割序列 ,切分得到a,b,c
在取分割点的时候 我们只关心其个位上的数字?
这道题的题解思路来源:蓝桥杯-带分数-python_晓宜的博客-CSDN博客在ACWing已经AC,蓝桥杯评判系统有一点问题据说导致超时。
一开始看到这题,没想法。感觉这是一道物理题撞来撞去。
后来看了别人的分析,懂了其实有时候没必要把问题想的太复杂,转换一下就简单了。
感冒A对撞上健康B 两者反向跑 等效于各自继续朝着原来的方向向前跑只不过B也感冒了?
所以无论怎么撞 都可以把每个蚂蚁看作单向运动 那么必然都能跑到端点
如果和A面对面的有n个蚂蚁,那么这n个蚂蚁势必会影响到跟在A屁股后的m个蚂蚁
那么就一共有m+n+1个蚂蚁感冒了 ,其他的蚂蚁感冒不着。
所以当觉得问题过于复杂了,很有可能是自己想得太复杂了,换一个想法,就好了。
小郑AC代码:
#能感染 只能是反向跑
n=int(input())
l=list(map(int,input().split()))
right,left=0,0
p=l[0]
for i in range(1,len(l)):
if p>0:#第一个蚂蚁向右走:如果结束循环right=0那么输出1
if abs(l[i])>abs(p) and l[i]*p<0:
right+=1#右侧蚂蚁感染数目
elif abs(l[i])<abs(p) and l[i]*p>0:
left+=1#左侧蚂蚁感染数目
else:
pass
else:#第一个蚂蚁向左走:如果结束循环left=0那么输出1
if abs(l[i])>abs(p) and l[i]*p>0:
right+=1#
elif abs(l[i])<abs(p) and l[i]*p<0:
left+=1
else:
pass
print(right+left+1) if right*left!=0 else print(1)
其次要注意严谨,第一个蚂蚁的朝向也会影响结果,不能草率下结论。
?埃筛法板子:
max=int(input())
prime=[0 for i in range(max+1)]
def generate_prime():
cnt=0#素数个数
is_prime=[1 for i in range(max+1)]#1标记素数,0标记非素数
is_prime[0]=is_prime[1]=0#0,1不是素数
for i in range(2,max+1):
if is_prime[i]==1:#是素数
cnt+=1
prime[cnt]=i
j=i
while j<=max:
is_prime[j]=0
j+=i#把i的倍数标记为非素数
return cnt
cnt=generate_prime()
for i in range(1,cnt+1):a
print(prime[i],end=' ')
#输出0~max的素数一般步骤
#两个容器 prime,is_prime prime[i]代表第i个素数,is_prime[i]代表第i是否为素数
#0还是1?
#一个计数器cnt 关联到prime下标,初始化为0
#遍历2到max 如果i是素数,1:那么通过cnt计入prime
#2:从[i,max]的范围内把i的倍数is_prime标记为非素数
#总结:两个容器 一个计数器