多少种取法问题
给定三个正整数m,n,s问从1到m这m个数里面取n个不同的数,使它们和是s,有多少种取法
输入 多组数据
输入的第一行是整数t,表示有t组数据
此后有t行,每行是一组数据 每组数据就是三个正整数,m,n, s ( n <= 10,s <= 20)
def ways(m, n, s):
if n==0:
if s == 0:
return 1
else:
return 0
if m < n:
return 0
if m*s == 0 and m+n!=0:
return 0
if m > s: m = s
return ways(m-1, n-1, s-m) + ways(m-1,n, s)#分为取m和不取m情况
t = int(input())
for i in range(t):
x=input()
m, n, s = list(map(int, x.split()))
print(ways(m, n, s))
成绩排序
给出班里某门课程的成绩单,请你按成绩从高到低对成绩单排序输出,如果有相同分数则名字字典序小的在前。
输入 第一行为n (0 < n < 20),表示班里的学生数目; 接下来的n行,每行为每个学生的名字和他的成绩, 中间用单个空格隔开。
样例输入
4
Kitty 80
Hanmeimei 90
Joey 92
Tim 28
样例输出
Joey 92
Hanmeimei 90
Kitty 80
Tim 28
n = int(input())
a = []
for i in range(n):
s = input().split()
a.append((s[0],int(s[1]))) #(string, int)
a.sort(key = lambda x: (-x[1],x[0]) ) #x表示a列表的一个元素(此处就是一个元组),相当于此处是以元组排序的①
for x in a: #注意:不是 range()函数遍历 而是直接 in 遍历
print(x[0], x[1])
①默认情况下内置的sort和sorted函数接收的参数是元组时,他将会先按元组的第一个元素进行排序再按第二个元素进行排序。
图像模糊处理
给定n行m列的图像各像素点的灰度值,要求用如下方法对其进行模糊化处理:
- 四周最外侧的像素点灰度值不变;
- 中间各像素点新灰度值为该像素点及其上下左右相邻四个像素点原灰度值的平均(舍入到最接近的整数)。
样例输入
4 5
100 0 100 0 50
50 100 200 0 0
50 50 100 100 200
100 100 50 50 100
样例输出
100 0 100 0 50
50 80 100 60 0
50 80 100 90 200
100 100 50 50 100
import copy
n,m = map(int,input().split()) # ①
a = []
for i in range(n):
lst = list(map(int,input().split()))
a.append(lst)
b = copy.deepcopy(a) # ②
for i in range(1,n-1):
for j in range(1,m-1):
b[i][j] = round((a[i][j] + a[i-1][j] + a[i+1][j] + a[i][j-1] + a[i][j+1])/5)
for i in range(0,n):
for j in range(0,m):
print(b[i][j],end = " ")
print("")
①简化了
python xy = input().split()
x, y = int(xy[0]), int(xy[1])
的写法
②不能写:
b = a[:]
或者b = a.copy()
这二者都是浅拷贝,就是只能最外侧数据的拷贝,一维数组没问题,二维数组就会出问题,不能管到二维;
③看题要仔细:
间各像素点新灰度值为该像素点及其上下左右相邻四个像素点原灰度值的平均
新像素点的值不仅等于周围四个像素点相加的平均还包括本身
矩阵乘法
计算两个矩阵的乘法。nm阶的矩阵A乘以mk阶的矩阵B得到的矩阵C 是n*k阶的,
且C[i][j] = A[i][0]*B[0][j] +A[i][1]*B[1][j] + …… +A[i][m-1]*B[m-1][j] (C[i][j]表示C矩阵中第i行第j列元素)。
样例输入
3 2 3
1 1
1 1
1 1
1 1 1
1 1 1
样例输出
2 2 2
2 2 2
2 2 2
n,m,k=map(int,input().split())
A,B,C=[],[],[]
for i in range(n):
A.append(list(map(int, input().split())))
for i in range(m):
B.append(list(map(int, input().split())))
for i in range(n):
D=[]
for j in range(k):
S = 0
for d in range(m):
S+=A[i][d]*B[d][j]
D.append(S)
C.append(D)
for i in range(n):
for j in range(k):
print(C[i][j],end=" ")
print("\n",end="")
回文子串
回文子串即从左往右输出和从右往左输出结果是一样的字符串,比如:abba,cccdeedccc都是回文字符串。
样例输入
123321125775165561
样例输出
33
11
77
55
2332
2112
5775
6556
123321
165561
tmpStr = input()
n = len(tmpStr)
huiwen = []
for i in range(0, n-1):
for j in range(i+1, n):
if tmpStr[i: j+1] == tmpStr[j: i: -1]+tmpStr[i]:#①
tmpList = [j-i+1, i, tmpStr[i:j+1]]#②
huiwen.append(tmpList)
huiwen.sort()
for i in range(len(huiwen)):
print(huiwen[i][2])
①Python强大的切片功能
等号左边表示从tmpStr[i]
到tmpStr[j]
间的子串,等号右边表示反向
从tmpStr[j]
到tmpStr[i]
的转置子串tmpStr[j: i:-1]
表示反向从j
到i+1
步长为-1
(负号代表从右往左)的字符组合
②记录了三个属性:tmpList[][0]
表示子串长度,tmpList[][1]
表示子串起始索引,tmpList[][2]
表示目标子串
字符的排列组合问题
输入一个字符串,打印出该字符串中字符的所有排列。
例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。
输入 abcd
输出
abcd abcd abdc abdc acbd adcb
bacd bacd cabd cadb cbad cbad
cbad cbad cbda cdba dabc dacb
dbac dbca dbca dbca dbca dcab
方法一:
result=[] #用来放排列组合的结果
def pailie(s): #编写递归函数,实现排列组合
# ------------------BEGIN----------------------
if len(s) <= 1:
return [s]
else:
str_list = []
for i in range(len(s)):
for temp in pailie(s[:i]+s[i+1:]):# 取出s[i]后剩余的字符串
str_list.append(s[i]+temp)#将取出的每个字符与子问题的解依次组合
return str_list
# -----------------END---------------------------
def p_result(result): # 按字符串大小顺序,输出排列结果
result.sort()
j = 0
for i in result:
j += 1
print(i, end=' ')
if j % 6 == 0:
print()
def main():
s=input() #输入要排列的字符串
# ------------------调用递归函数-------------------
result = pailie(s)
# -----------------END---------------------------
p_result(result)
main() #调用main函数
方法二:
def func(s):
from itertools import permutations # python有现场的处理排列组合的模块
result = []
for i in permutations(s, len(s)):#参数:可迭代对象 从可迭代对象中取出几个值来计算其排列
result.append(list(i))
return result
s = input()
print(func(s))