> 文档中心 > 蓝桥杯Python刷题

蓝桥杯Python刷题

目录

一 入门练习

1 A+B问题 

2 序列求和

3 圆的面积

4 Fibonacci数列

二 基础练习

1 闰年判断

2 01字串

3 字母图形

4 数列特征

5 查找整数

6 杨辉三角形

7 特殊的数字

8 回文数

9 特殊回文数

10 十进制转换为十六进制

11 十六进制转十进制

12 十六进制转八进制

13 数列排序

14 时间转换

15 字符串对比

16 分解质因数

17 矩阵乘法

18 矩形面积交

19 完美的代价

20 数的读法

三、真题

1、高斯日记

2、排他平方数

3、振兴中华

4、颠倒的价牌

5、错误票据

6、颠倒的价牌

7、垒骰子

8、饮料换购

9、手链样式

10、牌型总数

11、奇妙的数字

12、星系炸弹

13、方程整数解

14、斐波那契

15、地宫取宝

16、蚂蚁感冒

17、扑克序列

18、神奇算式

19、猜年龄


一 入门练习

1 A+B问题 

'''资源限制时间限制:1.0s   内存限制:256.0MB问题描述输入A、B,输出A+B。说明:在“问题描述”这部分,会给出试题的意思,以及所要求的目标。输入格式输入的第一行包括两个整数,由空格分隔,分别表示A、B。说明:“输入格式”是描述在测试你的程序时,所给的输入一定满足的格式。做题时你应该假设所给的输入是一定满足输入格式的要求的,所以你不需要对输入的格式进行检查。多余的格式检查可能会适得其反,使用你的程序错误。在测试的时候,系统会自动将输入数据输入到你的程序中,你不能给任何提示。比如,你在输入的时候提示“请输入A、B”之类的话是不需要的,这些多余的输出会使得你的程序被判定为错误。输出格式输出一行,包括一个整数,表示A+B的值。说明:“输出格式”是要求你的程序在输出结果的时候必须满足的格式。在输出时,你的程序必须满足这个格式的要求,不能少任何内容,也不能多任何内容。如果你的内容和输出格式要求的不一样,你的程序会被判断为错误,包括你输出了提示信息、中间调试信息、计时或者统计的信息等。样例输入12 45说明:“样例输入”给出了一组满足“输入格式”要求的输入的例子。这里给出的输入只是可能用来测试你的程序的一个输入,在测试的时候,还会有更多的输入用来测试你的程序。样例输出57说明:“样例输出”给出了一组满足“输出格式”要求的输出的例子。样例输出中的结果是和样例输入中的是对应的,因此,你可以使用样例的输入输出简单的检查你的程序。要特别指出的是,能够通过样例输入输出的程序并不一定是正确的程序,在测试的时候,会用很多组数据进行测试,而不局限于样例数据。有可能一个程序通过了样例数据,但测试的时候仍只能得0分,可能因为这个程序只在一些类似样例的特例中正确,而不具有通用性,再测试更多数据时会出现错误。比如,对于本题,如果你写一个程序不管输入是什么都输入57,则样例数据是对的,但是测试其他数据,哪怕输入是1和2,这个程序也输出57,则对于其他数据这个程序都不正确。数据规模与约定-10000 <= A, B <= 10000。说明:“数据规模与约定”中给出了试题中主要参数的范围。这个范围对于解题非常重要,不同的数据范围会导致试题需要使用不同的解法来解决。比如本题中给的A、B范围不大,可以使用整型(int)来保存,如果范围更大,超过int的范围,则要考虑其他方法来保存大数。有一些范围在方便的时候是在“问题描述”中直接给的,所以在做题时不仅要看这个范围,还要注意问题描述。'''A = list(input().split())print(int(A[0])+int(A[1]))

2 序列求和

'''资源限制时间限制:1.0s   内存限制:256.0MB问题描述求1+2+3+...+n的值。输入格式输入包括一个整数n。输出格式输出一行,包括一个整数,表示1+2+3+...+n的值。样例输入4样例输出10样例输入100说明:有一些试题会给出多组样例输入输出以帮助你更好的做题。一般在提交之前所有这些样例都需要测试通过才行,但这不代表这几组样例数据都正确了你的程序就是完全正确的,潜在的错误可能仍然导致你的得分较低。样例输出5050数据规模与约定1 <= n <= 1,000,000,000。'''n =int(input())sum = (n+n**2)/2print(int(sum))

3 圆的面积

'''资源限制时间限制:1.0s   内存限制:256.0MB问题描述给定圆的半径r,求圆的面积。输入格式输入包含一个整数r,表示圆的半径。输出格式输出一行,包含一个实数,四舍五入保留小数点后7位,表示圆的面积。说明:在本题中,输入是一个整数,但是输出是一个实数。对于实数输出的问题,请一定看清楚实数输出的要求,比如本题中要求保留小数点后7位,则你的程序必须严格的输出7位小数,输出过多或者过少的小数位数都是不行的,都会被认为错误。实数输出的问题如果没有特别说明,舍入都是按四舍五入进行。样例输入4样例输出50.2654825数据规模与约定1 <= r <= 10000。提示本题对精度要求较高,请注意π的值应该取较精确的值。你可以使用常量来表示π,比如PI=3.14159265358979323,也可以使用数学公式来求π,比如PI=atan(1.0)*4。'''PI = 3.14159265358979323r = int(input())print("%.7f"%(PI*r*r))

4 Fibonacci数列

#试题 入门训练 Fibonacci数列'''资源限制时间限制:1.0s   内存限制:256.0MB问题描述Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。输入格式输入包含一个整数n。输出格式输出一行,包含一个整数,表示Fn除以10007的余数。说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。样例输入10样例输出55样例输入22样例输出7704数据规模与约定1 <= n <= 1,000,000。'''# #得分90的答案,超时# N = int(input())# F1 = 1# F2 = 1# i = 1# while i<=N:#     if i<=2:#  F3 = 1#     else:#  F3 = F1 + F2#  F1 = F2#  F2 = F3#     i += 1 # print(F3%10007) #利用余数的加法定理'''余数和定理(数论):a与b的和除以c的余数,等于a,b分别除以c的余数之和再对c取余'''N = int(input())F1 = 1F2 = 1i = 1while i<=N:    if i<=2: F3 = 1    else: F3 = (F1%10007 + F2%10007)%10007 F1 = F2 F2 = F3    i += 1 print(F3) 

二 基础练习

1 闰年判断

'''资源限制时间限制:1.0s   内存限制:256.0MB问题描述给定一个年份,判断这一年是不是闰年。当以下情况之一满足时,这一年是闰年:1. 年份是4的倍数而不是100的倍数;2. 年份是400的倍数。其他的年份都不是闰年。输入格式输入包含一个整数y,表示当前的年份。输出格式输出一行,如果给定的年份是闰年,则输出yes,否则输出no。说明:当试题指定你输出一个字符串作为结果(比如本题的yes或者no,你需要严格按照试题中给定的大小写,写错大小写将不得分。样例输入2013样例输出no样例输入2016样例输出yes数据规模与约定1990 <= y <= 2050。'''n = int(input())if ((n%4==0 and n%100!=0) or n%400==0):    print("yes")else:    print("no")

2 01字串

'''资源限制时间限制:1.0s   内存限制:256.0MB问题描述对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:0000000001000100001100100请按从小到大的顺序输出这32种01串。输入格式本试题没有输入。输出格式输出32行,按从小到大的顺序每行一个长度为5的01串。样例输出00000000010001000011'''#直接转换即可#bin()将10进制转换为2进制,舍掉0b,再填满5位for i in range(32):    print(bin(i)[2:].zfill(5))

3 字母图形

'''资源限制时间限制:1.0s   内存限制:256.0MB问题描述利用字母可以组成一些美丽的图形,下面给出了一个例子:ABCDEFGBABCDEFCBABCDEDCBABCDEDCBABC这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。输入格式输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。输出格式输出n行,每个m个字符,为你的图形。样例输入5 7样例输出ABCDEFGBABCDEFCBABCDEDCBABCDEDCBABC数据规模与约定1 <= n, m j:     list2.append(chr(ord('A')+i-j)) else:     list2.append(chr(ord('A')+j-i))     for k in range(len(list2)): print(list2[k],end='')    print()    #print('\n') #注意这是两个换行    list2 = []

4 数列特征

'''资源限制时间限制:1.0s   内存限制:256.0MB问题描述给出n个数,找出这n个数的最大值,最小值,和。输入格式第一行为整数n,表示数的个数。第二行有n个数,为给定的n个数,每个数的绝对值都小于10000。输出格式输出三行,每行一个整数。第一行表示这些数中的最大值,第二行表示这些数中的最小值,第三行表示这些数的和。样例输入51 3 -2 4 5样例输出5-211数据规模与约定1 <= n <= 10000。'''n = int(input())list1=[] #空列表接收字符list1 = input().split()for i in range(n):    list1[i] = int(list1[i])print(max(list1))print(min(list1))print(sum(list1))

5 查找整数

'''资源限制时间限制:1.0s   内存限制:256.0MB问题描述给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。输入格式第一行包含一个整数n。第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。第三行包含一个整数a,为待查找的数。输出格式如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1。样例输入61 9 4 8 3 99样例输出2数据规模与约定1 <= n <= 1000。'''def select_index():    for i in range(n): if Num == list1[i]:     return i+1    if Num not in list1: return -1if __name__=='__main__':    n = int(input())    list1 = []    list1 = input().split()    Num = int(input())    for i in range(n): list1[i] = int(list1[i]) #把字符转为整型数字    print(select_index())

6 杨辉三角形

'''资源限制时间限制:1.0s   内存限制:256.0MB问题描述杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)^i的展开式的系数。  它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。  下面给出了杨辉三角形的前4行:     1    1 1   1 2 1  1 3 3 1  给出n,输出它的前n行。输入格式输入包含一个数n。输出格式输出杨辉三角形的前n行。每一行从这一行的第一个数开始依次输出,中间使用一个空格分隔。请不要在前面输出多余的空格。样例输入4样例输出11 11 2 11 3 3 1数据规模与约定1 <= n 0: for i in range(len(list1)):     print(list1[i],end=' ') #先打印一行,再计算下一行 print() # print自带换行 list1 = [1] + [list1[j] + list1[j+1] for j in range(len(list1)-1)] +[1] #使用列表生成式,三角形中的每个数字等于它两肩上的数字相加 n -= 1 

7 特殊的数字

'''资源限制时间限制:1.0s   内存限制:512.0MB问题描述  153是一个非常特殊的数,它等于它的每位数字的立方和,即153=1*1*1+5*5*5+3*3*3。编程求所有满足这种条件的三位十进制数。输出格式  按从小到大的顺序输出满足条件的三位十进制数,每个数占一行。'''if __name__ == "__main__":    for i in range(100,1000,1): bai = i // 100 shi = (i // 10) % 10 ge = i % 10 if (i == bai**3 + shi**3 + ge ** 3):      print(i)

8 回文数

'''资源限制时间限制:1.0s   内存限制:512.0MB问题描述  1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。输出格式  按从小到大的顺序输出满足条件的四位十进制数。'''if __name__ == "__main__":    for i in range(1000,10000,1): str2='' str1 = str(i) for j in range(len(str1)):     a = str1[len(str1)-j-1]     str2 += a #向空字符串后拼接字符用+ if str1 == str2:     print(i)

9 特殊回文数

'''资源限制时间限制:1.0s   内存限制:512.0MB问题描述  123321是一个非常特殊的数,它从左边读和从右边读是一样的。  输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。输入格式  输入一行,包含一个正整数n。输出格式  按从小到大的顺序输出满足条件的整数,每个整数占一行。样例输入52样例输出899998989989998899数据规模和约定  1<=n<=54。'''# #下方法运行超时# if __name__ == "__main__":#     n = int(input())#     for i in range(10000,1000000,1):#  str1 = str(i)#  str2 = ''#  num_sum = 0#  for j in range(len(str1)):#      a = str1[len(str1)-j-1]#      str2 += a#      num_sum += int(a)#  if (str1 == str2) and (num_sum == n):#      print(i)# #下方法也会超时# if __name__ == "__main__":#     n = int(input())#     for i in range(10000,1000000,1):#  str1 = str(i)#  str2 = str1[::-1] #快速实现字符串顺序颠倒#  num_sum = 0#  for j in range(len(str1)):#      num_sum += int(str1[j])#  if (str1 == str2) and (num_sum == n):#      print(i)'''这里借鉴某大佬,将功能封装为函数,结果就不超时了,没想通,请知道的大佬指点'''def is_Palindrome(num):    str1 = str(num)    str2 = str1[::-1] #快速实现字符串顺序颠倒    if str1 == str2: return True    else: return Falsedef num_sum(num):    num_sum = 0    str_num = str(num)    for i in range(len(str_num)): num_sum += int(str_num[i])    return num_sumif __name__ == "__main__":    n = int(input())    for num in range(10000,1000000,1): if is_Palindrome(num) and num_sum(num)==n :     print(num)

10 十进制转换为十六进制

'''资源限制时间限制:1.0s   内存限制:512.0MB问题描述  十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。  给出一个非负整数,将它表示成十六进制的形式。输入格式  输入包含一个非负整数a,表示要转换的数。0<=a<=2147483647输出格式  输出这个整数的16进制表示样例输入30样例输出1E'''num = int(input())print(hex(num).upper()[2:])

11 十六进制转十进制

'''资源限制时间限制:1.0s   内存限制:512.0MB问题描述  从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。  注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。样例输入FFFF样例输出65535'''num = input()print(int(num,16))

12 十六进制转八进制

'''资源限制时间限制:1.0s   内存限制:512.0MB问题描述  给定n个十六进制正整数,输出它们对应的八进制数。输入格式  输入的第一行为一个正整数n (1<=n<=10)。  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。输出格式  输出n行,每行为输入对应的八进制正整数。  【注意】  输入的十六进制数不会有前导0,比如012A。  输出的八进制数也不能有前导0。样例输入  2  39  123ABC样例输出  71  4435274  【提示】  先将十六进制数转换成某进制数,再由某进制数转换成八进制。'''#int()可以将字符串或数字按某种进制方式转换为10进制n = int(input())num_list = []for i in range(n):    num = input()    num_list.append(int(num,16))for i in range(n):    print(oct(num_list[i])[2:])

13 数列排序

'''资源限制时间限制:1.0s   内存限制:512.0MB问题描述  给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200输入格式  第一行为一个整数n。  第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。输出格式  输出一行,按从小到大的顺序输出排序后的数列。样例输入58 3 6 4 9样例输出3 4 6 8 9'''N = int(input())list1=[]list1 = input().split()for i in range(len(list1)):    list1[i]=int(list1[i])if len(list1) != N:    print("imput error")list1.sort()for i in range(N):    print(list1[i],end=' ')

14 时间转换

'''资源限制时间限制:1.0s   内存限制:512.0MB问题描述  给定一个以秒为单位的时间t,要求用“::”的格式来表示这个时间。表示时间,表示分钟,而表示秒,它们都是整数且没有前导的“0”。例如,若t=0,则应输出是“0:0:0”;若t=3661,则输出“1:1:1”。输入格式  输入只有一行,是一个整数t(0<=t<=86399)。输出格式  输出只有一行,是以“::”的格式所表示的时间,不包括引号。样例输入0样例输出0:0:0样例输入5436样例输出1:30:36'''#把秒转换为小时制时间if __name__ == "__main__":    sec = int(input())    h = sec // 3600    m = (sec - h*3600) // 60    s = sec - m*60 - h*3600    print('{}:{}:{}'.format(h,m,s))

15 字符串对比

'''资源限制时间限制:1.0s   内存限制:512.0MB问题描述  给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一:  1:两个字符串长度不等。比如 Beijing 和 Hebei  2:两个字符串不仅长度相等,而且相应位置上的字符完全一致(区分大小写),比如 Beijing 和 Beijing  3:两个字符串长度相等,相应位置上的字符仅在不区分大小写的前提下才能达到完全一致(也就是说,它并不满足情况2)。比如 beijing 和 BEIjing  4:两个字符串长度相等,但是即使是不区分大小写也不能使这两个字符串一致。比如 Beijing 和 Nanjing  编程判断输入的两个字符串之间的关系属于这四类中的哪一类,给出所属的类的编号。输入格式  包括两行,每行都是一个字符串输出格式  仅有一个数字,表明这两个字符串的关系编号样例输入BEIjingbeiJing 样例输出3'''def judgment(str1,str2):    if len(str1) != len(str2): print(1)    elif str1 == str2 : print(2)    elif str1.upper() == str2.upper(): print(3)    else: print(4)if __name__ == "__main__":    str1 = input()    str2 = input()    judgment(str1,str2)

16 分解质因数

'''资源限制时间限制:1.0s   内存限制:512.0MB问题描述  求出区间[a,b]中所有整数的质因数分解。输入格式  输入两个整数a,b。输出格式  每行输出一个数的分解,形如k=a1*a2*a3...(a1<=a2<=a3...,k也是从小到大的)(具体可看样例)样例输入3 10样例输出3=34=2*25=56=2*37=78=2*2*29=3*310=2*5提示  先筛出所有素数,然后再分解。数据规模和约定  2<=a<=b<=10000''''''解答思路:借鉴https://blog.csdn.net/m0_37586991/article/details/79678043?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。(2)如果nk,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。'''def is_prime(n):  #判断数n是否是素数    for i in range(2,n): if n % i == 0:     return False    return Truedef decomposition(a,b):    for num in range(a,b+1,1): if is_prime(num):  #是素数就直接打印     print('{}={}'.format(num,num)) else:#否则就进行分解     print('{}='.format(num),end='')     while(num!=1):  for i in range(2,num+1):      if num % i == 0 : #满足则说明i是num的一个质因数   print('{}'.format(i),end='')   num = num // i   if num!=1:print('*',end='')   break  #跳出本层for循环,重新进入while循环从2开始查找质因数     print()    if __name__ == "__main__":    a,b = map(int, input().split()) #空格分割,map调整为整型    decomposition(a,b)

17 矩阵乘法

'''资源限制时间限制:1.0s   内存限制:512.0MB问题描述  给定一个N阶矩阵A,输出A的M次幂(M是非负整数)  例如:  A =  1 2  3 4  A的2次幂  7 10  15 22输入格式  第一行是一个正整数N、M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数  接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值输出格式  输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开样例输入2 21 23 4样例输出7 1015 22''''''1 题目只测试矩阵的幂,方阵的幂的形状是不改变的2 题目还测试了0次幂,方阵的0次幂是单位阵'''#接收数据 注 input()返回的实际是一维列表def Receive_data(n,matrix):    for i in range(n): row = input().split() for j in range(n):     matrix[i].append(int(row[j]))    return matrix#定义矩阵的幂def matrix_power(matrix,n,m):     result_temp = matrix #临时存放每次相乘的数据    m -= 1    while m != 0: result = [[0 for _ in range(n)] for _ in range(n)] #创建新的二维列表存放结果 注意不能创建空列表,否则会出现result列表index越界 for i in range(n):      for j in range(n):  for k in range(n):      result[i][j] += result_temp[i][k] * matrix[k][j] m -= 1 result_temp = result    return result if __name__ == "__main__":    n,m = map(int,input().split())    matrix = [[] for _ in range(n)] #创建二维列表    matrix = Receive_data(n,matrix)    if m!=0: result = matrix_power(matrix,n,m)    else: result = [[0 for _ in range(n)] for _ in range(n)] for i in range(n):     result[i][i] = 1    # print(matrix_power(matrix,n,m))    # 按照格式输出    for i in range(n): for j in range(n):     print(result[i][j],end=' ') print()

18 矩形面积交

'''资源限制时间限制:1.0s   内存限制:512.0MB问题描述  平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴。对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积。输入格式  输入仅包含两行,每行描述一个矩形。  在每行中,给出矩形的一对相对顶点的坐标,每个点的坐标都用两个绝对值不超过10^7的实数表示。输出格式  输出仅包含一个实数,为交的面积,保留到小数后两位。样例输入1 1 3 32 2 4 4样例输出1.00''''''矩形交的条件矩形1 对角坐标(x1,y1) (x2,y2)矩形2 对角坐标(x3,y3) (x4,y4)实际测试时坐标x1不一定比x2小并且两个矩形的相对位置也不知道,虽然可以分类但是麻烦可以手画矩形相交图总结得出如果 max(矩形1最小的横坐标 矩形2最小的横坐标) < min(矩形1最大的横坐标 矩形2最大的横坐标) 有横向相交可能性如果 max(矩形1最小的纵坐标 矩形2最小的纵坐标) < min(矩形1最大的纵坐标 矩形2最大的纵坐标) 有纵向相交可能性即 max(min(x1,x2),min(x3,x4)) < min(max(x1,x2),max(x3,x4)) 且 max(min(y1,y2),min(y3,y4)) < min(max(y1,y2),max(y3,y4)) 才能相交则相交面积为 (min(x2,x4) - max(x1,x3)) * (min(y2,y4) - max(y1,y3))'''if __name__ == "__main__":    x1,y1,x2,y2 = map(float,input().split())    x3,y3,x4,y4 = map(float,input().split())    area = 0    if max(min(x1,x2),min(x3,x4)) < min(max(x1,x2),max(x3,x4)) and max(min(y1,y2),min(y3,y4)) < min(max(y1,y2),max(y3,y4)): area = (min(max(x1,x2),max(x3,x4)) - max(min(x1,x2),min(x3,x4))) * (min(max(y1,y2),max(y3,y4)) - max(min(y1,y2),min(y3,y4))) print('%.2f' % area)    else: print('%.2f' % area)

19 完美的代价

'''资源限制时间限制:1.0s   内存限制:512.0MB问题描述  回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。  交换的定义是:交换两个相邻的字符  例如mamad  第一次交换 ad : mamda  第二次交换 md : madma  第三次交换 ma : madam (回文!完美!)输入格式  第一行是一个整数N,表示接下来的字符串的长度(N <= 8000)  第二行是一个字符串,长度为N.只包含小写字母输出格式  如果可能,输出最少的交换次数。  否则输出Impossible样例输入5mamad样例输出3''''''判断有无可能是回文数Impossible不可能是回文数的两种情况:    如果n是偶数,则每类字符应该出现偶数次    如果n是计数,则只能有一类字符出现次数为奇数字符串自带count方法:用于统计字符串里某个字符出现的次数。可选参数为在字符串搜索的开始与结束位置count方法说明见 https://www.runoob.com/python/att-string-count.html'''def is_Palindrome(n,str1):    cnt = 0    if n%2 == 0: for i in range(26): #依次统计字符串中a-z的出现次数     if str1.count(chr(ord('a')+i)) % 2 != 0: #当n是偶数 而 字母出现次数有奇数时  print("Impossible")  return False return True    else: for i in range(26):     if str1.count(chr(ord('a')+i)) % 2 != 0:  cnt += 1 if cnt != 1:     print("Impossible")     return False else:     return True'''如果是回文数,需要计算最少移动步数https://blog.csdn.net/u011506951/article/details/26382569?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&dist_request_id=81a8cb98-fa29-46f0-94df-89d96ceda1cf&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control上面博客介绍了基本原理移动次数最小原理相当于尽量保持原来的正向前一半的顺序其实就是正向遍历字符串,当到某个字母的时候,同时再反向遍历字符串当相同的字母,将反向遍历的次数作为交换次数这时的交换次数最少这个博客图解适合理解 代码也容易理解https://blog.csdn.net/bianxia123456/article/details/104388390''' def step(N,str1,str2):    step = 0    for i in range(N//2): if str1[i:].count(str1[i]) != 1: #字符出现了两次及以上     # index() 函数用于从列表中找出某个值第一个匹配项的索引位置。     # 可参考 https://www.runoob.com/python/att-list-index.html     temp = str2[:N - i].index(str1[i])  #得到索引位置     #pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。     # 可参考 https://www.runoob.com/python/att-list-pop.html      str2.pop(temp)     step += temp     str1 = str2[::-1]  else:  #只出现了一次     step += N//2 - i #将该字母移动到中间所需要的步数    return stepif __name__ == "__main__":    N = int(input())    str1 = list(input())    str2 = str1[::-1]    if is_Palindrome(N,str1): print(step(N,str1,str2))

20 数的读法

'''资源限制时间限制:1.0s   内存限制:512.0MB问题描述  Tom教授正在给研究生讲授一门关于基因的课程,有一件事情让他颇为头疼:一条染色体上有成千上万个碱基对,它们从0开始编号,到几百万,几千万,甚至上亿。  比如说,在对学生讲解第1234567009号位置上的碱基时,光看着数字是很难准确的念出来的。  所以,他迫切地需要一个系统,然后当他输入12 3456 7009时,会给出相应的念法:  十二亿三千四百五十六万七千零九  用汉语拼音表示为  shi er yi san qian si bai wu shi liu wan qi qian ling jiu  这样他只需要照着念就可以了。  你的任务是帮他设计这样一个系统:给定一个阿拉伯数字串,你帮他按照中文读写的规范转为汉语拼音字串,相邻的两个音节用一个空格符格开。  注意必须严格按照规范,比如说“10010”读作“yi wan ling yi shi”而不是“yi wan ling shi”,“100000”读作“shi wan”而不是“yi shi wan”,“2000”读作“er qian”而不是“liang qian”。输入格式  有一个数字串,数值大小不超过2,000,000,000。输出格式  是一个由小写英文字母,逗号和空格组成的字符串,表示该数的英文读法。样例输入1234567009样例输出shi er yi san qian si bai wu shi liu wan qi qian ling jiu''''''思路:佩服这博客,不知道他怎么想出来的https://blog.csdn.net/bianxia123456/article/details/104366900''' def read_num(num_4):    num = list(map(int,num_4))    '''    千位上的数字处理    非0直接读数字和千,否则数字和千都不读    '''    if num[0] != 0: temp.append(duyin1[num[0]]) temp.append("qian")    else: pass    if num[1] != 0: temp.append(duyin1[num[1]]) temp.append("bai")    # 不读百和百位上的0 的情况    # 1 千位百位都是0 如0023    # 2 千位不管,后三位是0 如1000或0000    elif (num[0] == 0 and num[1] == 0) or (num[1] == 0 and num[2] == 0 and num[3] == 0): pass    # '''    # 其余情况不读百 但要读百位上的0 如1023    # '''    else: temp.append(duyin1[num[1]])     # '''    # 十位上的数字处理    # 除开位0和1的两种情况,接直接读数字和十    # '''    if num[2] != 0 and num[2] != 1: temp.append(duyin1[num[2]]) temp.append("shi")    # '''    # 10只能读十,不能读一十    # 12只能读十二,不能读一十二    # '''    elif num[2] == 1 and num[1] == 0 and num[0] == 0: temp.append("shi")    # '''    # 如果百位和十位都为0 就不读 如1001 虽然读了一个0 但是这个0是读的百位上的0    # 如果十位和个位为0 也不读 如1100    # '''    elif (num[1] == 0 and num[2] == 0) or (num[2] == 0 and num[3] == 0): pass    # '''    # 只读数字 不读十 如1101    # '''    else: temp.append(duyin1[num[2]]) # '''    # 个位处理    # 为0不读    # 非0就读    # '''    if num[3] != 0: temp.append(duyin1[num[3]])    else: pass    return temp    if __name__ == "__main__":    num = input() #输入数字    l = len(num) #数字长度    duyin1 = ['ling','yi','er','san','si','wu','liu','qi','ba','jiu']    temp = [] #用来暂时存放4位读音    duyin = []    if 0 < l <= 4: duyin = read_num(num.rjust(4,'0')) #不足4位先调整为4位再读    elif 4 < l <= 8: new_num = num.rjust(8,'0') read_num(new_num[:4]) temp.append('wan') ''' 4位非全0 且千位为0 就要读千位的0 弥补读数函数中千位为0的情况 ''' if new_num[4:] != '0000' and new_num[4:][0] == '0':      temp.append('ling') duyin = read_num(new_num[4:])      elif 8 < l <= 10: new_num = num.rjust(12,'0') read_num(new_num[:4]) temp.append('yi') if new_num[4:8] != '0000':     read_num(new_num[4:8])     temp.append('wan') elif new_num[4:12] == '00000000':     pass else:     temp.append('ling') duyin = read_num(new_num[8:12])     for i in range(len(temp)):    print(duyin[i],end=' ')

三、真题

1、高斯日记

'''题目标题: 高斯日记    大数学家高斯有个好习惯:无论如何都要记日记。    他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210    后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?    高斯出生于:1777年4月30日。    在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。    高斯获得博士学位的那天日记上标着:8113    请你算出高斯获得博士学位的年月日。提交答案的格式是:yyyy-mm-dd, 例如:1980-03-21请严格按照格式,通过浏览器提交答案。注意:只提交这个日期,不要写其它附加内容,比如:说明性的文字。'''y = 1777m = 4d = 30def isleapyear(y):    return (y%4==0 and y%100 != 0) or y%400==0for i in range(8112):    d += 1    if m==12 and d==32: y += 1 m = 1 d = 1 continue    if (m==1 or m==3 or m==5 or m==7 or m==8 or m==10) and d==32: m += 1 d = 1 continue    if (m==4 or m==6 or m==9 or m==11) and d==31: m += 1 d = 1 continue    if (m==2 and isleapyear(y)) and d==30: m += 1 d = 1 continue    if (m==2 and (not isleapyear(y))) and d==29: m += 1 d = 1 continueprint("%d-%d-%d"%(y,m,d))

2、排他平方数

'''题目标题: 排它平方数    小明正看着 203879 这个数字发呆。    原来,203879 * 203879 = 41566646641    这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。    具有这样特点的6位数还有一个,请你找出它!    再归纳一下筛选要求:    1. 6位正整数    2. 每个数位上的数字不同    3. 其平方数的每个数位不含原数字的任何组成数位答案是一个6位的正整数。请通过浏览器提交答案。注意:只提交另一6位数,题中已经给出的这个不要提交。注意:不要书写其它的内容(比如:说明性的文字)。''''''枚举'''def check(x,y): #检查y中是否有x的数字    for s in str(x): if s in str(y):     return True #含有    return False #没有for i in range(1,10):    for j in range(0,10): if i != j:     for k in range(0,10):  if k!=j and k!=i:      for l in range(0,10):   if l!=i and l!=j and l!=k:for m in range(0,10):    if m!=i and m!=j and m!=k and m!=l: for n in range(0,10):     if n!=i and n!=j and n!=k and n!=l and n!=m:  num = i*100000+j*10000+k*1000+l*100+m*10+n  if not check(num,num**2):      print(num,num**2)

3、振兴中华

'''标题: 振兴中华    小明参加了学校的趣味运动会,其中的一个项目是:跳格子。    地上画着一些格子,每个格子里写一个字,如下所示:(也可参见p1.jpg)从我做起振我做起振兴做起振兴中起振兴中华    比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。    要求跳过的路线刚好构成“从我做起振兴中华”这句话。    请你帮助小明算一算他一共有多少种可能的跳跃路线呢?答案是一个整数,请通过浏览器直接提交该数字。注意:不要提交解答过程,或其它辅助说明类的内容。''''''从左上角走到右下角一共多少种走法?其中又有多少符合条件?这题不存在筛选,每种走法都符合条件动态规划枚举+计数采用迭代、递归做枚举,本题用递归'''def f(x,y):    if x==0 or y==0: #边界条件 f(i,j)表示(0,0)到(i,j)的走法 return 1    else: return f(x-1,y) + f(x,y-1)print(f(3,4))

4、颠倒的价牌

'''标题:猜年龄    小明带两个妹妹参加元宵灯会。别人问她们多大了,她们调皮地说:“我们俩的年龄之积是年龄之和的6倍”。    小明又补充说:“她们可不是双胞胎,年龄差肯定也不超过8岁啊。”    请你写出:小明的较小的妹妹的年龄。注意: 只写一个人的年龄数字,请通过浏览器提交答案。不要书写任何多余的内容。'''for i in range(100): # 哥哥年龄    for j in range(100): #妹妹年龄 if 0 < (i - j) <= 8:     if (i + j)*6 == i*j:  print(i,j) else:     continue

5、错误票据

''' 标题:错误票据 某涉密单位下发了某种票据,并要在年终全部收回。 每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。 因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。 你的任务是通过编程,找出断号的ID和重号的ID。 假设断号不可能发生在最大和最小号。 要求程序首先输入一个整数N(N<100)表示后面数据行数。 接着读入N行数据。 每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于100000) 每个整数代表一个ID号。 要求程序输出1行,含两个整数m n,用空格分隔。 其中,m表示断号ID,n表示重号ID 例如: 用户输入:    2    5 6 8 11 9    10 12 9 则程序输出:    7 9 再例如: 用户输入:    6    164 178 108 109 180 155 141 159 104 182 179 118 137 184 115 124 125 129 168 196    172 189 127 107 112 192 103 131 133 169 158    128 102 110 148 139 157 140 195 197    185 152 135 106 123 173 122 136 174 191 145 116 151 143 175 120 161 134 162 190    149 138 142 146 199 126 165 156 153 193 144 166 170 121 171 132 101 194 187 188    113 130 176 154 177 120 117 150 114 183 186 181 100 163 160 167 147 198 111 119 则程序输出:    105 120 资源约定: 峰值内存消耗 < 64M CPU消耗  < 1000ms 请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。 所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。 注意: main函数需要返回0 注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。 注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。 提交时,注意选择所期望的编译器类型。'''n = int(input())arr = []for i in range(n):    arr.append(list(map(int,input().split())))# print(arr)# 找每一行最小值min_arr = [None for _ in range(n)]max_arr = [None for _ in range(n)]for i in range(n):    min_arr[i] = min(arr[i])for i in range(n):    max_arr[i] = max(arr[i])min_num = min(min_arr)max_num = max(max_arr)'''二维数组转换成一维数组'''arr_num = []for j in range(n):    for k in range(len(arr[j])): arr_num.append(arr[j][k])'''找不存在的数'''for i in range(min_num,max_num):    if str(i) not in str(arr_num): print(i,end=' ')'''找重复的数'''for i in range(len(arr_num)):    if arr_num.count(arr_num[i])==2: print(arr_num[i],end='') break

6、颠倒的价牌

''' 标题: 颠倒的价牌 小李的店里专卖其它店中下架的样品电视机,可称为:样品电视专卖店。 其标价都是4位数字(即千元不等)。 小李为了标价清晰、方便,使用了预制的类似数码管的标价签,只要用颜色笔涂数字就可以了(参见p1.jpg)。 这种价牌有个特点,对一些数字,倒过来看也是合理的数字。如:1 2 5 6 8 9 0 都可以。这样一来,如果牌子挂倒了,有可能完全变成了另一个价格, 比如:1958 倒着挂就是:8561,差了几千元啊!! 当然,多数情况不能倒读,比如,1110 就不能倒过来,因为0不能作为开始数字。 有一天,悲剧终于发生了。某个店员不小心把店里的某两个价格牌给挂倒了。并且这两个价格牌的电视机都卖出去了! 庆幸的是价格出入不大,其中一个价牌赔了2百多,另一个价牌却赚了8百多,综合起来,反而多赚了558元。 请根据这些信息计算:赔钱的那个价牌正确的价格应该是多少? 答案是一个4位的整数,请通过浏览器直接提交该数字。 注意:不要提交解答过程,或其它辅助说明类的内容。''''''枚举所有四位数,可以颠倒的将其颠倒倒过来,再做差,把赔两百多和赚八百多的分别记录到两个集合中再遍历两个集合,两两相加找等于558的数'''def chartochar(s):    if s=='6': return '9'    elif s=='9': return '6'    else: return sdef reverse(str1):    str2=''    for i in range(3,-1,-1): # print(str1[i],chartochar(str1[i])) str2 += chartochar(str1[i])    return str2a = []b = []if __name__ == "__main__":    # str2 = reverse('1958')    # print(str2)    for i in range(1000,10000): str1 = str(i) if ('3' in str1) or ('4' in str1) or ('7' in str1) and '0' != str1[-1]:     continue # 颠倒过来 str2 = reverse(str1) j = int(str2) # 颠倒后的价格 plus = j-i if -300<plus<-200:     a.append([i,j,plus]) #存储信息 if  800<plus<900:     b.append([i,j,plus])     for i in range(len(a)): for j in range(len(b)):     if a[i][2] + b[j][2] == 558:  print(a[i],b[j])

7、垒骰子

'''垒骰子赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体。经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥!我们先来规范一下骰子:1 的对面是 4,2 的对面是 5,3 的对面是 6。假设有 m 组互斥现象,每组中的那两个数字的面紧贴在一起,骰子就不能稳定的垒起来。atm想计算一下有多少种不同的可能的垒骰子方式。两种垒骰子方式相同,当且仅当这两种方式中对应高度的骰子的对应数字的朝向都相同。由于方案数可能过多,请输出模 10^9 + 7 的结果。不要小看了 atm 的骰子数量哦~「输入格式」第一行两个整数 n mn表示骰子数目接下来 m 行,每行两个整数 a b ,表示 a 和 b 数字不能紧贴在一起。「输出格式」一行一个数,表示答案模 10^9 + 7 的结果。「样例输入」2 11 2「样例输出」544「数据范围」对于 30% 的数据:n <= 5对于 60% 的数据:n <= 100对于 100% 的数据:0 < n <= 10^9, m <= 36资源约定:峰值内存消耗 < 256MCPU消耗  < 2000ms''''''解法一 递归'''n,m = map(int,input().split())list1 = [[False for _ in range(7)] for _ in range(7)]dict1 = {1:4,2:5,3:6,4:1,5:2,6:3} # 对立面for _ in range(m): # 不能紧贴的面    x,y = map(int,input().split())    list1[x][y] = True    list1[y][x] = True  #输入不能紧贴的面 用true记录mod = 10**9 + 7ans = 0def f(up,cnt):    ans = 0    if cnt==0: return 4  #确定up面后可以旋转    for upp in range(1,7): if list1[dict1[up]][upp]:     continue ans += f(upp,cnt-1)    return ans    for up in range(1,7):    ans += 4*f(up,n-1)print(ans%mod)

8、饮料换购

'''饮料换购乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去(但不允许暂借或赊账)。请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于他初始买入的n瓶饮料,最后他一共能喝到多少瓶饮料。输入:一个整数n,表示开始购买的饮料数量(0<n0:    n -= 1    num += 1    if num % 3 == 0: n += 1print(num)

9、手链样式

'''手链样式小明有3颗红珊瑚,4颗白珊瑚,5颗黄玛瑙。他想用它们串成一圈作为手链,送给女朋友。现在小明想知道:如果考虑手链可以随意转动或翻转,一共可以有多少不同的组合样式呢?请你提交该整数。不要填写任何多余的内容或说明性的文字。'''#全排列 特殊去重from itertools import permutationsstr1 = 'LANQIAO'list1 = []list2 = []for item in list(permutations(str1)):    str1 = ''.join(item)    list2.append(str1)print(len(set(list2)))# 排除重复# list1.append(s+s)

10、牌型总数

'''牌型种数小明被劫持到X赌城,被迫与其他3人玩牌。一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。这时,小明脑子里突然冒出一个问题:如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?请填写该整数,不要填写任何多余的内容或说明文字。'''# import sys# sys.setrecursionlimit(9000000) #这里设置大一些ans = 0def f(k,cnt): # k代表每种牌型1-13 cnt到手的牌数    global ans    if cnt>13 or k>13: return    if k==13 and cnt==13: ans += 1 return    for i in range(5): f(k+1,cnt+i)f(0,0)print(ans)

11、奇妙的数字

'''奇妙的数字小明发现了一个奇妙的数字。它的平方和立方正好把0~9的10个数字每个用且只用了一次。你能猜出这个数字是多少吗?请填写该数字,不要填写任何多余的内容。''''''答案69'''def check(str_num,str_num1):    list1 = list(str_num)    list1.sort()    str_num2 = ''.join(list1)    if str_num1 == str_num2: return True    else: return Falsefor i in range(10000):    num1 = i**2    num2 = i**3    str_num = str(num1) + str(num2)    if len(str_num) == 10: if check(str_num,"0123456789"):     print(i)

12、星系炸弹

'''星系炸弹 在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。每个炸弹都可以设定多少天之后爆炸。比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。有一个贝塔炸弹,2014年11月9日放置,定时为1000天,请你计算它爆炸的准确日期。请填写该日期,格式为 yyyy-mm-dd  即4位年份2位月份2位日期。比如:2015-02-19请严格按照格式书写。不能出现其它文字或符号。''''''答案 2017-08-05'''y = 2014m = 11d = 9def isleapyear(y):    if y%400==0 or (y%4==0 and y%100!=0): return Truefor i in range(1,1001):    d += 1    if m in [1,3,5,7,8,10] and d==32: d = 1 m += 1    elif m in [12] and d==32: d = 1 m = 1 y += 1    elif m in [4,6,9,11] and d==31: d = 1 m += 1    elif m in [2] and isleapyear(y) and d==30: d = 1 m += 1    elif m in [2] and (not isleapyear(y)) and d==29: d = 1 m += 1print(y,m,d)    

13、方程整数解

'''方程整数解方程: a^2 + b^2 + c^2 = 1000(或参见【图1.jpg】)这个方程有正整数解吗?有:a,b,c=6,8,30 就是一组解。你能算出另一组合适的解吗?请填写该解中最小的数字。注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。''''''答案10'''time = 0for a in range(1,40):    for b in range(1,40): for c in range(1,40):     if a**2 + b**2 +c**2 == 1000:  print(a,b,c)

14、斐波那契

'''标题:斐波那契    斐波那契数列大家都非常熟悉。它的定义是:    f(x) = 1      .... (x=1,2)    f(x) = f(x-1) + f(x-2)      .... (x>2)    对于给定的整数 n 和 m,我们希望求出:    f(1) + f(2) + ... + f(n)  的值。但这个值可能非常大,所以我们把它对 f(m) 取模。    公式参见【图1.png】    但这个数字依然很大,所以需要再对 mod 求模。【数据格式】输入为一行用空格分开的整数 n m mod (0 < n, m, mod =n+2 (f(n+2)-1)%f(m)%mod 等价于 (f(n+2)-1)%mod# 否则一定要求f(m) # 斐波那契别用递归 用迭代'''解法一'''n,m,mod = map(int,input().split())f1 = 1f2 = 1def solvel():    global f1,f2    if m>=n+2: for i in range(3,n+2+1):     t = f1     f1 = f2     f2 = t + f1     # 结束后f2就是第n+2项 print((f2-1)%mod)    else: for i in range(3,n+2+1):     t = f1     f1 = f2     f2 = t + f1     if i == m: # 顺便求出f(m)  fibm = f2      # 结束后f2就是第n+2项 fibn_2 = f2 print((fibn_2-1)%fibm%mod)     solvel()'''#解法二n,m,mod = map(int,input().split())def fib(x):    if x==1 or x==2: return 1    else: return fib(x-1)+fib(x-2)num1 = 0num2 = fib(m)# for i in range(1,n+1):#     num1 += fib(i)num1 = fib(n+2)-1num1 %= fib(m)print(num1%mod)'''

15、地宫取宝

'''标题:地宫取宝    X 国王有一个地宫宝库。是 n x m 个格子的矩阵。每个格子放一件宝贝。每个宝贝贴着价值标签。    地宫的入口在左上角,出口在右下角。    小明被带到地宫的入口,国王要求他只能向右或向下行走。    走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿)。    当小明走到出口时,如果他手中的宝贝恰好是k件,则这些宝贝就可以送给小明。    请你帮小明算一算,在给定的局面下,他有多少种不同的行动方案能获得这k件宝贝。【数据格式】    输入一行3个整数,用空格分开:n m k (1<=n,m<=50, 1<=k<=12)    接下来有 n 行数据,每行有 m 个整数 Ci (0<=Ci<=12)代表这个格子上的宝物的价值    要求输出一个整数,表示正好取k个宝贝的行动方案数。该数字可能很大,输出它对 1000000007 取模的结果。例如,输入:2 2 21 22 1程序应该输出:2再例如,输入:2 3 21 2 32 1 5程序应该输出:14资源约定:峰值内存消耗 < 256MCPU消耗  k: #走出 return     cur = data[x][y]     if x==n-1 and y==m-1: #在最后一格子 if cnt==k:     ans += 1     if ans>mod:  ans = ans%mod if cnt==k-1 and cur>max_value:     ans += 1     if ans>mod:  ans = ans%mod  if cur>max_value: #可以取这个物品 dfs(x,y+1,cur,cnt+1) dfs(x+1,y,cur,cnt+1)    #对于价值更小或者价值更大 不取得情况    dfs(x,y+1,max_value,cnt)    dfs(x+1,y,max_value,cnt)   dfs(0,0,-1,0)    print(ans) #-1是因为第一个点的值可能为0

16、蚂蚁感冒

'''标题:蚂蚁感冒    长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。    每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。    当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。    这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。    请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。【数据格式】    第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数。    接着的一行是n个用空格分开的整数 Xi (-100 < Xi < 100), Xi的绝对值,表示蚂蚁离开杆子左边端点的距离。    正值表示头朝右,负值表示头朝左,数据中不会出现0值,也不会出现两只蚂蚁占用同一位置。    其中,第一个数据代表的蚂蚁感冒了。    要求输出1个整数,表示最后感冒蚂蚁的数目。例如,输入:35 -2 8程序应输出:1再例如,输入:5-10 8 -20 12 25程序应输出:3资源约定:峰值内存消耗 < 256MCPU消耗   0: #初始被感染蚂蚁往右走    for i in range(1,len(arr)): if arr[i] abs(x): #筛选从右向左走的并且位于x的右边的蚂蚁     # abs()绝对值     answer += 1    if answer != 1: #有从右向左的被传染 for i in range(1,len(arr)):     if arr[i] > 0 and abs(arr[i]) 0 and abs(arr[i])<abs(x): #筛选从左向右走的并且位于x的左边的蚂蚁     # abs()绝对值     ans += 1    if ans != 1: #有从左向右的被传染 for i in range(1,len(arr)):     if arr[i] abs(x): #筛选从左向右走的并且位于x的左边边的蚂蚁     # abs()绝对值  ans += 1    print(ans)

17、扑克序列

'''标题:扑克序列    A A 2 2 3 3 4 4, 一共4对扑克牌。请你把它们排成一行。    要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。    请填写出所有符合要求的排列中,字典序最小的那个。例如:22AA3344 比 A2A23344 字典序小。当然,它们都不是满足要求的答案。请通过浏览器提交答案。“A”一定不要用小写字母a,也不要用“1”代替。字符间一定不要留空格。''''''全排列+check() 用1来暂时表示A'''from itertools import permutations# print(len(list(permutations('1122'))))def check(str1):    if (str1.rfind('A') - str1.find('A') == 2) and (str1.rfind('2') - str1.find('2') == 3) and (str1.rfind('3') - str1.find('3') == 4) and (str1.rfind('4') - str1.find('4') == 5): return True    else: return Falseif __name__ == "__main__":    str1 = 'AA223344'    str2_list=[]    for item in list(permutations(str1)): str2 = "".join(item) if check(str2):     str2_list.append(str2)    print(set(str2_list)) #set去重

18、神奇算式

'''标题:神奇算式    由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。    比如:210 x 6 = 12608 x 473 = 378427 x 81 = 2187    都符合要求。    如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。    请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。'''time = 0for i in range(1,10):    for j in range(0,10): if i != j:     for k in range(0,10):  if k != i and k != j:      for l in range(0,10):   if l != k and l != j and l != i:num_str1 = str(i * (j*100 + k*10 + l))if str(i) in num_str1 and str(j) in num_str1 and str(k) in num_str1 and str(l) in num_str1:    time += 1num_str2 = str((i*10 + j) * (k*10 + l))if str(i) in num_str2 and str(j) in num_str2 and str(k) in num_str2 and str(l) in num_str2:    time += 1num_str3 = str((i*100 + j*10 + k) *  l)if str(i) in num_str3 and str(j) in num_str3 and str(k) in num_str3 and str(l) in num_str3:    time += 1print(time//2) # 交换律情况

19、猜年龄

'''标题:猜年龄    小明带两个妹妹参加元宵灯会。别人问她们多大了,她们调皮地说:“我们俩的年龄之积是年龄之和的6倍”。    小明又补充说:“她们可不是双胞胎,年龄差肯定也不超过8岁啊。”    请你写出:小明的较小的妹妹的年龄。注意: 只写一个人的年龄数字,请通过浏览器提交答案。不要书写任何多余的内容。'''for i in range(100): # 哥哥年龄    for j in range(100): #妹妹年龄 if 0 < (i - j) <= 8:     if (i + j)*6 == i*j:  print(i,j) else:     continue

身份验证指纹锁商城