1.七段码的解题思路就是排列组合,对于python来说这里需要掌握自带库itertools的基本用法,因为如果用简单的循环语句将字符串排列组合,会大大增加运行时间。关于python的自带库可以通过IDLE的help—>doc查看(或者点击F1快捷键)
import itertools
dic = {'a':['f','b'],
'b':['a','g','c'],
'c':['g','d','b'],
'd':['e','c'],
'e':['f','g','d'],
'f':['a','g','e'],
'g':['f','b','e','c']}
#首先将每段字符代码与它相邻的保存写成一个字典存储
AA=[]#保存每一个符和要求的字段
for i in range(2,8):#字段的最长长度为7
aa=list(itertools.combinations('abcdefg',i))#利用自带库itertools中的函数将'abcdefg'不重复组合。
for j in aa:
for num in itertools.permutations(j):#将组合转成无序排列的形式
for kk in range(len(num)-1):
if num[kk+1] not in dic[num[kk]]:#表示两个字符之间不可相连
break
else: #这里的else有着承接上一循环结束和if相反的作用
AA.append(num)
break #这里的break表示这种组合存在并且已经找到了,有去除重复的作用,比如abc和acd就是一种字体
print(len(AA)+7)#7是只有一个亮的情况的字符型。AA包含了2个到7个连续的灯接管亮的的情况
结果为:80
2.字串分值的思路是要理解题目:字符串的非空子集就是连续的字符串。比如abc的非空子集有:ab,bc,abc三个。所以这题用尺度分割比较合适
N=input()
for i in range(len(N)):
for j in range(i+1,len(N)+1):
kk=N[i:j]
for k in kk:
if kk.count(k)==1:
num+=1
print(num)
输入ababc
输出:21
3.砝码称重和1一样,也是排列组合问题
import itertools
N=int(input())
Zhong=[]
fama=list(map(int,input().split()))
for i in range(1,N+1):
for j in itertools.combinations(fama,i):
Zhong.append(sum(j))#不同组合的重量之和,熟练使用itertools
Zhong=list(set(Zhong))
ZZ=Zhong.copy()
for i in Zhong:
for j in Zhong:
if i!=j:
if abs(i-j) not in ZZ:
ZZ.append(abs(i-j))
print(len(ZZ))
输入:3
1 4 6
输出:10