├── 1.rumen ├── 1.1_Fibonacci_斐波那契数列.py ├── 1.2_Area_of_Circle_圆的面积.py ├── 1.3_Sum_of_List_序列求和.py └── 1.4_A+B_A+B问题.py ├── 2.Base_基础 ├── 2.10_数列特征.py ├── 2.11_字母图形.py ├── 2.12_01字串.py ├── 2.13_闰年判断.py ├── 2.14_阶乘计算.py ├── 2.15_长整数加法.py ├── 2.16_哈夫曼树.py ├── 2.17_n皇后.py ├── 2.18_报时助手.py ├── 2.19_回形取数.py ├── 2.1_list_sort_数列排序.py ├── 2.20_龟兔赛跑.py ├── 2.21 芯片测试.py ├── 2.22_FJ字符串.py ├── 2.23_sin之舞.py ├── 2.24_数的读法.py ├── 2.25_完美的代价.py ├── 2.26_矩阵面积交.py ├── 2.27_矩阵乘法.py ├── 2.28_2n皇后.py ├── 2.29_分解质因数.py ├── 2.2_16进制转换8进制.py ├── 2.30_字符串对比.py ├── 2.31_时间转换.py ├── 2.3_16进制转换10进制.py ├── 2.4_十进制转换十六进制.py ├── 2.5_特殊回文数.py ├── 2.6_回文数.py ├── 2.7_水仙花数.py ├── 2.8_杨辉三角.py └── 2.9_查找整数.py ├── 3.提高 ├── 3.1_预测身高.py ├── 3.2_最长滑雪道.py └── 3.3_k好数.py ├── 4.真题 ├── 4.1_不同子串.py ├── 4.2_年号字串.py ├── 4.3_数列求值.py ├── 4.4_数的分解.py └── 4.6_特别数的和.py └── README.md /1.rumen/1.1_Fibonacci_斐波那契数列.py: -------------------------------------------------------------------------------- 1 | """问题描述 2 | 3 | Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。 4 | 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。 5 | 6 | 输入描述 7 | n 8 | 输入格式输入包含一个整数n。 9 | 10 | 输出描述 11 | 12 | 输出格式输出一行,包含一个整数,表示Fn除以10007的余数。 13 | 14 | 说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可, 15 | 而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。 16 | 数据规模与约定1 <= n <= 1,000,000 17 | """ 18 | n = int(input()) 19 | F = [1 for i in range(n+1)] 20 | k = 3 21 | 22 | while k <= n: 23 | F[k] = (F[k-1] + F[k-2]) % 10007 24 | k +=1 25 | 26 | print(F[n]) -------------------------------------------------------------------------------- /1.rumen/1.2_Area_of_Circle_圆的面积.py: -------------------------------------------------------------------------------- 1 | """ 2 | 问题描述 3 | 4 | 给定圆的半径r,求圆的面积。 5 | 输入格式 6 | 7 | 输入包含一个整数r,表示圆的半径。 8 | 9 | 输出格式 10 | 11 | 输出一行,包含一个实数,四舍五入保留小数点后7位,表示圆的面积。 12 | 13 | 样例输入 14 | 15 | 4 16 | 17 | 样例输出 18 | 19 | 50.2654825 20 | 21 | 数据规模与约定 22 | 23 | 1 <= r <= 10000。 24 | """ 25 | import math 26 | 27 | r = int(input()) 28 | area = math.pi * r * r 29 | 30 | print('%.7f' % area) -------------------------------------------------------------------------------- /1.rumen/1.3_Sum_of_List_序列求和.py: -------------------------------------------------------------------------------- 1 | """ 2 | 问题描述 3 | 4 | 求1+2+3+…+n的值。 5 | 6 | 输入格式 7 | 8 | 输入包括一个整数n。 9 | 10 | 输出格式 11 | 12 | 输出一行,包括一个整数,表示1+2+3+…+n的值。 13 | 14 | 样例输入 15 | 16 | 4 17 | 18 | 样例输出 19 | 20 | 10 21 | 22 | 数据规模与约定 23 | 24 | 1 <= n <= 1,000,000,000. 25 | 26 | 注意不要用循环来做,否则当数据规模变大时会超时 27 | 28 | """ 29 | n = int(input()) 30 | s = n * (n+1) / 2 31 | print('%d' %s) -------------------------------------------------------------------------------- /1.rumen/1.4_A+B_A+B问题.py: -------------------------------------------------------------------------------- 1 | """ 2 | 问题描述 3 | 4 | 输入A、B,输出A+B。 5 | 6 | 输入格式 7 | 8 | 输入的第一行包括两个整数,由空格分隔,分别表示A、B。 9 | 10 | 输出格式 11 | 12 | 输出一行,包括一个整数,表示A+B的值。 13 | 14 | 样例输入 15 | 16 | 12 45 17 | 18 | 样例输出 19 | 20 | 57 21 | 22 | 数据规模与约定 23 | 24 | -10000 <= A, B <= 10000 25 | """ 26 | a, b = map(int, input().split()) 27 | print(a + b) -------------------------------------------------------------------------------- /2.Base_基础/2.10_数列特征.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 问题描述 3 | 给出n个数,找出这n个数的最大值,最小值,和。 4 | 5 | 输入格式 6 | 第一行为整数n,表示数的个数。 7 | 8 | 第二行有n个数,为给定的n个数,每个数的绝对值都小于10000。 9 | 10 | 输出格式 11 | 输出三行,每行一个整数。第一行表示这些数中的最大值,第二行表示这些数中的最小值,第三行表示这些数的和。 12 | 样例输入 13 | 5 14 | 1 3 -2 4 5 15 | 样例输出 16 | 5 17 | -2 18 | 11 19 | 数据规模与约定 20 | 1 <= n <= 10000。 21 | ''' 22 | n = int(input()) 23 | arr = input().split() 24 | 25 | print(max(int(arr[i]) for i in range(n))) 26 | print(min(int(arr[i]) for i in range(n))) 27 | print(sum(int(arr[i]) for i in range(n))) -------------------------------------------------------------------------------- /2.Base_基础/2.11_字母图形.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 问题描述 3 | 利用字母可以组成一些美丽的图形,下面给出了一个例子: 4 | 5 | ABCDEFG 6 | 7 | BABCDEF 8 | 9 | CBABCDE 10 | 11 | DCBABCD 12 | 13 | EDCBABC 14 | 15 | 这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。 16 | 17 | 输入格式 18 | 输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。 19 | 输出格式 20 | 输出n行,每个m个字符,为你的图形。 21 | 样例输入 22 | 5 7 23 | 样例输出 24 | ABCDEFG 25 | BABCDEF 26 | CBABCDE 27 | DCBABCD 28 | EDCBABC 29 | 数据规模与约定 30 | 1 <= n, m <= 26。 31 | ''' 32 | n, m = map(int,input().split()) 33 | graph = [[0 for j in range(m)] for i in range(n)] 34 | 35 | for i in range(n): 36 | for j in range(m): 37 | if j >= i: 38 | graph[i][j] = chr(ord('A')+j-i) 39 | else: 40 | graph[i][j] = chr(ord('A')+i-j) 41 | 42 | for i in range(n): 43 | for j in range(m): 44 | print(graph[i][j],end='') 45 | print() -------------------------------------------------------------------------------- /2.Base_基础/2.12_01字串.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 问题描述 3 | 对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是: 4 | 5 | 00000 6 | 7 | 00001 8 | 9 | 00010 10 | 11 | 00011 12 | 13 | 00100 14 | 15 | 请按从小到大的顺序输出这32种01串。 16 | 17 | 输入格式 18 | 本试题没有输入。 19 | 输出格式 20 | 输出32行,按从小到大的顺序每行一个长度为5的01串。 21 | 样例输出 22 | 00000 23 | 00001 24 | 00010 25 | 00011 26 | <以下部分省略> 27 | ''' 28 | for i in range(32): 29 | print("{0:0>5}".format(format(i,'b'))) -------------------------------------------------------------------------------- /2.Base_基础/2.13_闰年判断.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 问题描述 3 | 给定一个年份,判断这一年是不是闰年。 4 | 5 | 当以下情况之一满足时,这一年是闰年: 6 | 7 | 1. 年份是4的倍数而不是100的倍数; 8 | 9 | 2. 年份是400的倍数。 10 | 11 | 其他的年份都不是闰年。 12 | 13 | 输入格式 14 | 输入包含一个整数y,表示当前的年份。 15 | 输出格式 16 | 输出一行,如果给定的年份是闰年,则输出yes,否则输出no。 17 | 说明:当试题指定你输出一个字符串作为结果(比如本题的yes或者no,你需要严格按照试题中给定的大小写,写错大小写将不得分。 18 | 19 | 样例输入 20 | 2013 21 | 样例输出 22 | no 23 | 样例输入 24 | 2016 25 | 样例输出 26 | yes 27 | 数据规模与约定 28 | 1990 <= y <= 2050。 29 | ''' 30 | 31 | n = int(input()) 32 | if (n % 4 == 0 and n % 400 != 0) or n % 400 == 0: 33 | print("yes") 34 | else: 35 | print("no") 36 | -------------------------------------------------------------------------------- /2.Base_基础/2.14_阶乘计算.py: -------------------------------------------------------------------------------- 1 | """ 2 | 3 | 问题描述 4 |   输入一个正整数n,输出n!的值。 5 |   其中n!=123*…*n。 6 | 算法描述 7 |   n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。 8 |   将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。 9 |   首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。 10 | 输入格式 11 |   输入包含一个正整数n,n<=1000。 12 | 输出格式 13 |   输出n!的准确值。 14 | 样例输入 15 | 10 16 | 样例输出 17 | 3628800 18 | 特别注意n的规模 19 | 20 | 21 | """ 22 | n = int(input()) 23 | 24 | a = s = 1 25 | while a <= n: 26 | s = s * a 27 | a += 1 28 | print(s) 29 | -------------------------------------------------------------------------------- /2.Base_基础/2.15_长整数加法.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 问题描述 3 |   输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。 4 | 算法描述 5 |   由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。 6 |   定义一个数组A,A[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。同样可以用一个数组B来存储b。 7 |   计算c = a + b的时候,首先将A[0]与B[0]相加,如果有进位产生,则把进位(即和的十位数)存入r,把和的个位数存入C[0],即C[0]等于(A[0]+B[0])%10。然后计算A[1]与B[1]相加,这时还应将低位进上来的值r也加起来,即C[1]应该是A[1]、B[1]和r三个数的和.如果又有进位产生,则仍可将新的进位存入到r中,和的个位存到C[1]中。依此类推,即可求出C的所有位。 8 |   最后将C输出即可。 9 | 输入格式 10 |   输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。两个整数都不超过100位,两数的最高位都不是0。 11 | 输出格式 12 |   输出一行,表示a + b的值。 13 | 样例输入 14 | 20100122201001221234567890 15 | 2010012220100122 16 | 样例输出 17 | 20100122203011233454668012 18 | 19 | ''' 20 | 21 | 22 | def change_length(arr, l): 23 | arr = '0' * (l - len(arr)) + arr 24 | return arr 25 | 26 | 27 | arr = input() 28 | arr_2 = input() 29 | 30 | if len(arr) > len(arr_2): 31 | arr_2 = change_length(arr_2, len(arr)) 32 | elif len(arr) < len(arr_2): 33 | arr = change_length(arr, len(arr_2)) 34 | 35 | result = [0 for i in range(len(arr) + 1)] 36 | k = 0 37 | for i in range(len(arr)): 38 | rs = k + int(arr[len(arr) - i - 1]) + int(arr_2[len(arr_2)-i-1]) 39 | result[len(arr) - i] = rs % 10 40 | k = 0 41 | if rs >= 10: 42 | k = int(rs / 10) 43 | 44 | if k != 0: 45 | result[0] = k 46 | for i in range(len(result) ): 47 | print(result[i], end='') 48 | # print(result[-1]) 49 | else: 50 | for i in range(len(result) - 1): 51 | print(result[i+1], end='') 52 | # print(result[-1]) -------------------------------------------------------------------------------- /2.Base_基础/2.16_哈夫曼树.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 问题描述 3 |   Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。 4 |   给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下: 5 |   1. 找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}中。这个过程的费用记为pa + pb。 6 |   2. 重复步骤1,直到{pi}中只剩下一个数。 7 |   在上面的操作过程中,把所有的费用相加,就得到了构造Huffman树的总费用。 8 |   本题任务:对于给定的一个数列,现在请你求出用该数列构造Huffman树的总费用。 9 | 10 | 例如,对于数列{pi}={5, 3, 8, 2, 9},Huffman树的构造过程如下: 11 |   1. 找到{5, 3, 8, 2, 9}中最小的两个数,分别是2和3,从{pi}中删除它们并将和5加入,得到{5, 8, 9, 5},费用为5。 12 |   2. 找到{5, 8, 9, 5}中最小的两个数,分别是5和5,从{pi}中删除它们并将和10加入,得到{8, 9, 10},费用为10。 13 |   3. 找到{8, 9, 10}中最小的两个数,分别是8和9,从{pi}中删除它们并将和17加入,得到{10, 17},费用为17。 14 |   4. 找到{10, 17}中最小的两个数,分别是10和17,从{pi}中删除它们并将和27加入,得到{27},费用为27。 15 |   5. 现在,数列中只剩下一个数27,构造过程结束,总费用为5+10+17+27=59。 16 | 输入格式 17 |   输入的第一行包含一个正整数n(n<=100)。 18 |   接下来是n个正整数,表示p0, p1, …, pn-1,每个数不超过1000。 19 | 输出格式 20 |   输出用这些数构造Huffman树的总费用。 21 | 样例输入 22 | 5 23 | 5 3 8 2 9 24 | 样例输出 25 | 59 26 | 27 | ''' 28 | 29 | n = int(input()) 30 | 31 | arr = list(map(int, input().split())) 32 | 33 | price = [0 for i in range(n-1)] 34 | 35 | for i in range(n-1): 36 | arr.sort() 37 | value = arr.pop(0) 38 | value_1 = arr.pop(0) 39 | price[i] = value + value_1 40 | arr.append(price[i]) 41 | 42 | print(sum(price)) -------------------------------------------------------------------------------- /2.Base_基础/2.17_n皇后.py: -------------------------------------------------------------------------------- 1 | """ 2 | 3 | 要在n*n的国际象棋棋盘中放n个皇后, 4 | 使任意两个皇后都不能互相吃掉。 5 | 规则:皇后能吃掉同一行、同一列、同一对角线的任意棋子。 6 | 求所有的解。 7 | n=8是就是著名的八皇后问题了。 8 | 9 | """ 10 | maxsum = 0 11 | 12 | 13 | def queen(A, cur=0): 14 | global maxsum 15 | if cur == len(A): 16 | # print(A) 17 | sum = my_Max(A, data) 18 | if sum > maxsum: 19 | maxsum = sum 20 | return 0 21 | for col in range(len(A)): 22 | A[cur], flag = col, True 23 | for row in range(cur): 24 | if A[row] == col or abs(col - A[row]) == cur - row: 25 | flag = False 26 | break 27 | if flag: 28 | queen(A, cur + 1) 29 | 30 | def my_Max(A, data): 31 | sum = 0 32 | for i in range(8): 33 | sum += data[i][A[i]] 34 | return sum 35 | 36 | # n = int(input()) 37 | data = [list(map(int, input().split())) for _ in range(8)] 38 | queen([None]*8) 39 | print(maxsum) -------------------------------------------------------------------------------- /2.Base_基础/2.18_报时助手.py: -------------------------------------------------------------------------------- 1 | h, m = map(int, input().split()) 2 | time = {0: 'zero', 1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five', 6: 'six', 7: 'seven', 8: 'eight', 9: 'nine', 3 | 10: 'ten', 11: 'eleven', 12: 'twelve', 13: 'thirteen', 14: 'fourteen', 15: 'fifteen', 16: 'sixteen', 4 | 17: 'seventeen', 18: 'eighteen', 19: 'nineteen', 20: 'twenty', 21: 'twenty one', 22: 'twenty two', 5 | 23: 'twenty three', 30: 'thirty', 40: 'forty', 50: 'fifty'} 6 | 7 | if m == 0: 8 | print(time[h] + ' o\'clock') 9 | else: 10 | print(time[h], end=' ') 11 | if 0 < m <= 20 or m == 30 or m == 40 or m == 50: 12 | print(time[m]) 13 | elif 20 < m <= 30: 14 | print(time[20] + ' ' + time[m - 20]) 15 | elif 30 < m <= 40: 16 | print(time[30] + ' ' + time[m - 30]) 17 | elif 40 < m <= 50: 18 | print(time[40] + ' ' + time[m - 40]) 19 | else: 20 | print(time[50] + ' ' + time[m - 50]) 21 | -------------------------------------------------------------------------------- /2.Base_基础/2.19_回形取数.py: -------------------------------------------------------------------------------- 1 | m, n = map(int, input().split()) 2 | data = [list(map(int, input().split())) for _ in range(m)] 3 | row = 0 4 | col = 0 5 | count = 0 6 | while count < m*n: 7 | while row < m and data[row][col] != -1: 8 | print(data[row][col], end=' ') 9 | data[row][col] = -1 10 | row += 1 11 | count += 1 12 | row -= 1 13 | col += 1 14 | while col < n and data[row][col] != -1: # 向右 15 | print(data[row][col], end=' ') 16 | data[row][col] = -1 17 | col += 1 18 | count += 1 19 | row -= 1 20 | col -= 1 21 | while row >= 0 and data[row][col] != -1: 22 | print(data[row][col], end=' ') 23 | data[row][col] = -1 24 | row -= 1 25 | count += 1 26 | row += 1 27 | col -= 1 28 | while col >= 0 and data[row][col] != -1: 29 | print(data[row][col], end=' ') 30 | data[row][col] = -1 31 | col -= 1 32 | count += 1 33 | col += 1 34 | row += 1 35 | -------------------------------------------------------------------------------- /2.Base_基础/2.1_list_sort_数列排序.py: -------------------------------------------------------------------------------- 1 | """ 2 | 问题描述 3 |   给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200 4 | 输入格式 5 |   第一行为一个整数n。 6 |   第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。 7 | 输出格式 8 |   输出一行,按从小到大的顺序输出排序后的数列。 9 | 样例输入 10 | 5 11 | 8 3 6 4 9 12 | 样例输出 13 | 3 4 6 8 9 14 | """ 15 | n = int(input()) 16 | arr = list(map(int,input().split())) 17 | arr.sort() 18 | #type1 19 | for i in range(n): 20 | print(arr[i],end=' ') 21 | # #type2 22 | # for i in range(n - 1): 23 | # print(arr[i], end=' ') 24 | # print(arr[n-1]) 25 | # #type3 26 | # for i in range(n - 1): 27 | # print(arr[i], end=' ') 28 | # print(arr[n-1], end='') -------------------------------------------------------------------------------- /2.Base_基础/2.20_龟兔赛跑.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 3 | 问题描述 4 |   话说这个世界上有各种各样的兔子和乌龟,但是研究发现,所有的兔子和乌龟都有一个共同的特点——喜欢赛跑。 5 | 于是世界上各个角落都不断在发生着乌龟和兔子的比赛,小华对此很感兴趣,于是决定研究不同兔子和乌龟的赛跑。 6 | 他发现,兔子虽然跑比乌龟快,但它们有众所周知的毛病——骄傲且懒惰,于是在与乌龟的比赛中,一旦任一秒结束后兔子发现自己领先t米或以上,它们就会停下来休息s秒。对于不同的兔子,t,s的数值是不同的,但是所有的乌龟却是一致——它们不到终点决不停止。 7 | 然而有些比赛相当漫长,全程观看会耗费大量时间,而小华发现只要在每场比赛开始后记录下兔子和乌龟的数据——兔子的速度v1(表示每秒兔子能跑v1米), 8 | 乌龟的速度v2,以及兔子对应的t,s值,以及赛道的长度l——就能预测出比赛的结果。但是小华很懒, 9 | 不想通过手工计算推测出比赛的结果,于是他找到了你——清华大学计算机系的高才生——请求帮助,请你写一个程序, 10 | 对于输入的一场比赛的数据v1,v2,t,s,l,预测该场比赛的结果。 11 | 输入格式 12 |   输入只有一行,包含用空格隔开的五个正整数v1,v2,t,s,l,其中(v1,v2<=100;t<=300;s<=10;l<=10000且为v1,v2的公倍数) 13 | 输出格式 14 |   输出包含两行,第一行输出比赛结果——一个大写字母“T”或“R”或“D”,分别表示乌龟获胜,兔子获胜,或者两者同时到达终点。 15 |   第二行输出一个正整数,表示获胜者(或者双方同时)到达终点所耗费的时间(秒数)。 16 | 样例输入 17 | 10 5 5 2 20 18 | 样例输出 19 | D 20 | 4 21 | 样例输入 22 | 10 5 5 1 20 23 | 样例输出 24 | R 25 | 3 26 | 样例输入 27 | 10 5 5 3 20 28 | 样例输出 29 | T 30 | 4 31 | 32 | ''' 33 | 34 | data = list(map(int, input().split())) 35 | 36 | rabbit = tortoise = time = 0 37 | 38 | flag = False 39 | 40 | while True: 41 | if rabbit == data[-1] or tortoise == data[-1]: 42 | break 43 | if rabbit - tortoise >= data[2]: 44 | for i in range(data[3]): 45 | tortoise += data[1] 46 | time += 1 47 | if tortoise == data[-1]: 48 | flag = True 49 | break 50 | if flag: 51 | break 52 | time += 1 53 | rabbit += data[0] 54 | tortoise += data[1] 55 | 56 | 57 | if rabbit > tortoise: 58 | print('R') 59 | print(time) 60 | elif rabbit < tortoise: 61 | print('T') 62 | print(time) 63 | else: 64 | print('D') 65 | print(time) 66 | -------------------------------------------------------------------------------- /2.Base_基础/2.21 芯片测试.py: -------------------------------------------------------------------------------- 1 | n = int(input()) 2 | data = [list(map(int, input().split())) for _ in range(n)] 3 | # print(data) 4 | chip = [True for _ in range(n)] 5 | for col in range(n): 6 | count = 0 7 | for row in range(n): 8 | if data[row][col] == 0: 9 | count += 1 10 | if count > n/2: 11 | chip[col] = False 12 | for i in range(n): 13 | if chip[i]: 14 | print(i+1, end=' ') 15 | -------------------------------------------------------------------------------- /2.Base_基础/2.22_FJ字符串.py: -------------------------------------------------------------------------------- 1 | n = int(input()) 2 | str = '' 3 | for i in range(n): 4 | str = str + chr(ord('A') + i) +str 5 | 6 | print(str) -------------------------------------------------------------------------------- /2.Base_基础/2.23_sin之舞.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 问题描述 3 |   最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功。所以他准备和奶牛们做一个“Sine之舞”的游戏,寓教于乐,提高奶牛们的计算能力。 4 |   不妨设 5 |   An=sin(1–sin(2+sin(3–sin(4+…sin(n))…) 6 |   Sn=(…(A1+n)A2+n-1)A3+…+2)An+1 7 |   FJ想让奶牛们计算Sn的值,请你帮助FJ打印出Sn的完整表达式,以方便奶牛们做题。 8 | 输入格式 9 |   仅有一个数:N<201。 10 | 输出格式 11 |   请输出相应的表达式Sn,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。 12 | 样例输入 13 | 3 14 | 样例输出 15 | ((sin(1)+3)sin(1–sin(2))+2)sin(1–sin(2+sin(3)))+1 16 | 17 | ''' 18 | 19 | 20 | def A(n, k): 21 | 22 | if n == k: 23 | return 24 | print('sin(%d' % (n + 1), end='') 25 | 26 | if n + 1 != k: 27 | if n%2 == 1: 28 | print('+', end='') 29 | else: 30 | print('-', end='') 31 | else: 32 | print(')', end='') 33 | n += 1 34 | 35 | A(n, k) 36 | 37 | def S(n): 38 | k = t =1 39 | if n == 0: 40 | return 0 41 | 42 | for i in range(n - 1): 43 | print('(', end='') 44 | 45 | while n != 0: 46 | A(0, k) 47 | for i in range(t - 1): 48 | print(')', end='') 49 | print('+%d' % n, end='') 50 | if n != 1: 51 | print(')', end='') 52 | 53 | k += 1 54 | t += 1 55 | n -= 1 56 | 57 | # A(0, 1) 58 | 59 | n = int (input()) 60 | S(n) -------------------------------------------------------------------------------- /2.Base_基础/2.24_数的读法.py: -------------------------------------------------------------------------------- 1 | n = input() 2 | pin_yin = {'0': 'ling', '1': 'yi', '2': 'er', '3': 'san', '4': 'si', '5': 'wu', 3 | '6': 'liu', '7': 'qi', '8': 'ba', '9': 'jiu'} 4 | pin_yin_2 = {0: '', 1: '', 2: 'shi', 3: 'bai', 4: 'qian', 5: 'wan', 6: 'shi', 5 | 7: 'bai', 8: 'qian', 9: 'yi', 10: 'shi'} 6 | n = n + ' ' 7 | l = len(n) - 1 8 | # print(l) 9 | for i in range(l): 10 | j = int(n[i]) 11 | # print(i) 12 | if j != 0: 13 | if(l - i == 2 or l - i == 6 or l - i == 10) and j == 1: 14 | if i != 0: 15 | # print('yes') 16 | print(pin_yin['1'], end=' ') 17 | print(pin_yin_2[2], end=' ') 18 | continue 19 | print(pin_yin[n[i]], end=' ') 20 | print(pin_yin_2[l - i], end=' ') 21 | else: 22 | if l - i == 5 or l - i == 9: 23 | print(pin_yin_2[l - i], end=' ') 24 | if n[i+1] == '0' or i == l - 1: 25 | continue 26 | 27 | print(pin_yin['0'], end=' ') -------------------------------------------------------------------------------- /2.Base_基础/2.25_完美的代价.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 问题描述 3 |   回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。 4 |   交换的定义是:交换两个相邻的字符 5 |   例如mamad 6 |   第一次交换 ad : mamda 7 |   第二次交换 md : madma 8 |   第三次交换 ma : madam (回文!完美!) 9 | 输入格式 10 |   第一行是一个整数N,表示接下来的字符串的长度(N <= 8000) 11 |   第二行是一个字符串,长度为N.只包含小写字母 12 | 输出格式 13 |   如果可能,输出最少的交换次数。 14 |   否则输出Impossible 15 | 样例输入 16 | 5 17 | mamad 18 | 样例输出 19 | 3 20 | 21 | ''' 22 | 23 | n = int(input()) 24 | 25 | pal = list(input()) 26 | count = flag = 0 27 | # print(pal) 28 | 29 | m = n - 1 30 | if n == 1: 31 | print(count) 32 | exit() 33 | for i in range(m): 34 | for k in range(m, i -1 , -1): 35 | # print(i, ' ', k) 36 | if k == i: 37 | if n % 2 == 0 or flag == 1: 38 | print('Impossible') 39 | exit() 40 | flag = 1 41 | count += int(n / 2) - i 42 | elif pal[k] == pal[i]: 43 | for j in range(k, m): 44 | pal[j], pal[j + 1] = pal[j + 1], pal[j] 45 | count += 1 46 | m -= 1 47 | break 48 | 49 | print(count) 50 | -------------------------------------------------------------------------------- /2.Base_基础/2.26_矩阵面积交.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 问题描述 3 |   平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴。对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积。 4 | 输入格式 5 |   输入仅包含两行,每行描述一个矩形。 6 |   在每行中,给出矩形的一对相对顶点的坐标,每个点的坐标都用两个绝对值不超过10^7的实数表示。 7 | 输出格式 8 |   输出仅包含一个实数,为交的面积,保留到小数后两位。 9 | 样例输入 10 | 1 1 3 3 11 | 2 2 4 4 12 | 样例输出 13 | 1.00 14 | 15 | ''' 16 | rect_1 = list(map(float, input().split())) 17 | rect_2 = list(map(float, input().split())) 18 | area = 0 19 | 20 | x1 = max(min(rect_1[0], rect_1[2]), min(rect_2[0], rect_2[2])) 21 | y1 = max(min(rect_1[1], rect_1[3]), min(rect_2[1], rect_2[3])) 22 | x2 = min(max(rect_1[0], rect_1[2]), max(rect_2[0], rect_2[2])) 23 | y2 = min(max(rect_1[1], rect_1[3]), max(rect_2[1], rect_2[3])) 24 | # 25 | # area = abs((x2 - x1)*(y2 - y1)) 26 | # print('%.2f' %area) 27 | 28 | if x1 < x2 and y1 < y2: 29 | area = (x2 - x1)*(y2 - y1) 30 | print('%.2f' % area) 31 | else: 32 | print('%.2f' %area) 33 | 34 | 35 | -------------------------------------------------------------------------------- /2.Base_基础/2.27_矩阵乘法.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 问题描述 3 |   给定一个N阶矩阵A,输出A的M次幂(M是非负整数) 4 |   例如: 5 |   A = 6 |   1 2 7 |   3 4 8 |   A的2次幂 9 |   7 10 10 |   15 22 11 | 输入格式 12 |   第一行是一个正整数N、M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数 13 |   接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值 14 | 输出格式 15 |   输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开 16 | 样例输入 17 | 2 2 18 | 1 2 19 | 3 4 20 | 样例输出 21 | 7 10 22 | 15 22 23 | 24 | ''' 25 | 26 | 27 | def multi_rect (rect_1, shape_1, rect_2, shape_2): 28 | if shape_1[1] != shape_2[0]: 29 | return 30 | rect_ = [[0 for _ in range(shape_2[1])] for _ in range(shape_1[0])] 31 | shape_ = (shape_1[0], shape_2[1]) 32 | for i in range(shape_1[0]): 33 | for k in range(shape_2[1]): 34 | for j in range(shape_1[1]): 35 | rect_[i][k] += rect_1[i][j] * rect_2[j][k] 36 | return rect_, shape_ 37 | 38 | 39 | n, m = map(int, input().split()) 40 | rect = [[] for _ in range(n)] 41 | 42 | for i in range(n): 43 | arr = input().split() 44 | for j in range(n): 45 | rect[i].append(int(arr[j])) 46 | 47 | result, shape = rect, (n, n) 48 | 49 | if m == 0: 50 | result = [[0 for _ in range(n)] for _ in range(n)] 51 | for i in range(n): 52 | result[i][i] = 1 53 | else: 54 | for _ in range(m - 1): 55 | result, shape = multi_rect(rect, (n, n), result, shape) 56 | 57 | 58 | for i in range(shape[0]): 59 | for j in range(shape[1]): 60 | print(result[i][j], end=' ') 61 | print() -------------------------------------------------------------------------------- /2.Base_基础/2.28_2n皇后.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 问题描述 3 |   给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。 4 | 输入格式 5 |   输入的第一行为一个整数n,表示棋盘的大小。 6 |   接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。 7 | 输出格式 8 |   输出一个整数,表示总共有多少种放法。 9 | 样例输入 10 | 4 11 | 1 1 1 1 12 | 1 1 1 1 13 | 1 1 1 1 14 | 1 1 1 1 15 | 样例输出 16 | 2 17 | 样例输入 18 | 4 19 | 1 0 1 1 20 | 1 1 1 1 21 | 1 1 1 1 22 | 1 1 1 1 23 | 样例输出 24 | 0 25 | 26 | ''' 27 | 28 | def black_queen(k): 29 | global count 30 | 31 | for i in range(k - 1): 32 | judge = b_queen[i] - b_queen[k - 1] 33 | if judge == 0 or abs(k - 1 - i) == abs(judge): 34 | return 35 | 36 | if k == n: 37 | # print(b_queen, w_queen) 38 | 39 | count += 1 40 | return 41 | for i in range(n): 42 | if i != w_queen[k] and chessboard[k][i] == 1: 43 | b_queen[k] = i 44 | black_queen(k + 1) 45 | 46 | 47 | def white_queen(k): 48 | # global count 49 | 50 | for i in range(k - 1): 51 | judge = w_queen[i] - w_queen[k - 1] 52 | if judge == 0 or abs(k - 1 - i) == abs(judge): 53 | return 54 | 55 | if k == n: 56 | black_queen(0) 57 | return 58 | for i in range(n): 59 | if chessboard[k][i] == 1: 60 | w_queen[k] = i 61 | white_queen(k + 1) 62 | 63 | 64 | n = int(input()) 65 | count = 0 66 | chessboard = [[] for _ in range(n)] 67 | for i in range(n): 68 | arr = input().split() 69 | for j in range(n): 70 | chessboard[i].append(int(arr[j])) 71 | w_queen = [0 for _ in range(n)] 72 | b_queen = [0 for _ in range(n)] 73 | 74 | white_queen(0) 75 | print(count) -------------------------------------------------------------------------------- /2.Base_基础/2.29_分解质因数.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 问题描述 3 |   求出区间[a,b]中所有整数的质因数分解。 4 | 输入格式 5 |   输入两个整数a,b。 6 | 输出格式 7 |   每行输出一个数的分解,形如k=a1a2a3…(a1<=a2<=a3…,k也是从小到大的)(具体可看样例) 8 | 样例输入 9 | 3 10 10 | 样例输出 11 | 3=3 12 | 4=22 13 | 5=5 14 | 6=23 15 | 7=7 16 | 8=222 17 | 9=33 18 | 10=25 19 | 20 | ''' 21 | from math import sqrt 22 | 23 | 24 | def is_prime(n): 25 | for i in range(2, n): 26 | if n % i == 0: 27 | return False 28 | return True 29 | 30 | a, b = map(int, input().split()) 31 | for i in range(a, b+1): 32 | if is_prime(i): 33 | print(i, '=', i, sep='') 34 | else: 35 | print(i, '=', sep='', end='') 36 | temp = i 37 | j = 2 38 | while temp > 1: 39 | if temp % j == 0: 40 | temp = int(temp/j) 41 | print(j, end='') 42 | if temp != 1: 43 | print('*', end='') 44 | else: 45 | j += 1 46 | print() -------------------------------------------------------------------------------- /2.Base_基础/2.2_16进制转换8进制.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 问题描述 3 |   给定n个十六进制正整数,输出它们对应的八进制数。 4 | 5 | 输入格式 6 |   输入的第一行为一个正整数n (1<=n<=10)。 7 |   接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。 8 | 9 | 输出格式 10 |   输出n行,每行为输入对应的八进制正整数。 11 | 12 | 【注意】 13 |   输入的十六进制数不会有前导0,比如012A。 14 |   输出的八进制数也不能有前导0。 15 | 16 | 样例输入 17 |   2 18 |   39 19 |   123ABC 20 | 21 | 样例输出 22 |   71 23 |   4435274 24 | 25 | 【提示】 26 |   先将十六进制数转换成某进制数,再由某进制数转换成八进制。 27 | ''' 28 | t = int(input()) 29 | for i in range(t): 30 | n =input() 31 | ans = format(int(n,16), 'o') 32 | print(ans) 33 | -------------------------------------------------------------------------------- /2.Base_基础/2.30_字符串对比.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 问题描述 3 |   给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一: 4 |   1:两个字符串长度不等。比如 Beijing 和 Hebei 5 |   2:两个字符串不仅长度相等,而且相应位置上的字符完全一致(区分大小写),比如 Beijing 和 Beijing 6 |   3:两个字符串长度相等,相应位置上的字符仅在不区分大小写的前提下才能达到完全一致(也就是说,它并不满足情况2)。比如 beijing 和 BEIjing 7 |   4:两个字符串长度相等,但是即使是不区分大小写也不能使这两个字符串一致。比如 Beijing 和 Nanjing 8 |   编程判断输入的两个字符串之间的关系属于这四类中的哪一类,给出所属的类的编号。 9 | 输入格式 10 |   包括两行,每行都是一个字符串 11 | 输出格式 12 |   仅有一个数字,表明这两个字符串的关系编号 13 | 样例输入 14 | BEIjing 15 | 16 | beiJing 17 | 18 | 样例输出 19 | 3 20 | 21 | ''' 22 | 23 | 24 | str_1 = input() 25 | str_2 = input() 26 | if len(str_1) != len(str_2): 27 | print(1) 28 | elif str_1 == str_2: 29 | print(2) 30 | elif str_1.upper() == str_2.upper(): 31 | print(3) 32 | else: 33 | print(4) 34 | -------------------------------------------------------------------------------- /2.Base_基础/2.31_时间转换.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 问题描述 3 |   给定一个以秒为单位的时间t,要求用H:M:S的格式来表示这个时间。H表示时间,M表示分钟,而S表示秒,它们都是整数且没有前导的“0”。例如,若t=0,则应输出是“0:0:0”;若t=3661,则输出“1:1:1”。 4 | 输入格式 5 |   输入只有一行,是一个整数t(0<=t<=86399)。 6 | 输出格式 7 |   输出只有一行,是以“H:M:S”的格式所表示的时间,不包括引号。 8 | 样例输入 9 | 0 10 | 样例输出 11 | 0:0:0 12 | 样例输入 13 | 5436 14 | 样例输出 15 | 1:30:36 16 | ''' 17 | n = int(input()) 18 | h = int(n/3600) 19 | m = int((n - h * 3600)/60) 20 | s = int(n - 3600 * h - m * 60) 21 | print(h, ':', m, ':', s, sep='') -------------------------------------------------------------------------------- /2.Base_基础/2.3_16进制转换10进制.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 问题描述 3 |   从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。 4 |   注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。 5 | 样例输入 6 | FFFF 7 | 样例输出 8 | 65535 9 | ''' 10 | n = input() 11 | print(int(n,16)) -------------------------------------------------------------------------------- /2.Base_基础/2.4_十进制转换十六进制.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 问题描述 3 |   十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有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。 4 |   给出一个非负整数,将它表示成十六进制的形式。 5 | 输入格式 6 |   输入包含一个非负整数a,表示要转换的数。0<=a<=2147483647 7 | 输出格式 8 |   输出这个整数的16进制表示 9 | 样例输入 10 | 30 11 | 样例输出 12 | 1E 13 | ''' 14 | n = int(input()) 15 | print(format(n,'X')) -------------------------------------------------------------------------------- /2.Base_基础/2.5_特殊回文数.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 问题描述 3 |   123321是一个非常特殊的数,它从左边读和从右边读是一样的。 4 |   输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。 5 | 输入格式 6 |   输入一行,包含一个正整数n。 7 | 输出格式 8 |   按从小到大的顺序输出满足条件的整数,每个整数占一行。 9 | 样例输入 10 | 52 11 | 样例输出 12 | 899998 13 | 989989 14 | 998899 15 | 数据规模和约定 16 |   1<=n<=54。 17 | ''' 18 | #我们先判断是否为回文数再来求数字之和,因为满足回文数的数字并不多,因此减少了很多无效的求和运算。 19 | n = int(input('')) 20 | for i in range(10000, 1000000): 21 | num = str(i) 22 | if num == num[::-1]: 23 | if n == sum(int(j) for j in num): 24 | print(num) -------------------------------------------------------------------------------- /2.Base_基础/2.6_回文数.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 问题描述 3 |   1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。 4 | 输出格式 5 |   按从小到大的顺序输出满足条件的四位十进制数。 6 | ''' 7 | 8 | for i in range(1000, 10000): 9 | num = str(i) 10 | if num == num[::-1]: 11 | print(num) -------------------------------------------------------------------------------- /2.Base_基础/2.7_水仙花数.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 问题描述 3 |   153是一个非常特殊的数,它等于它的每位数字的立方和,即153=1*1*1+5*5*5+3*3*3。编程求所有满足这种条件的三位十进制数。 4 | 输出格式 5 |   按从小到大的顺序输出满足条件的三位十进制数,每个数占一行。 6 | ''' 7 | for i in range(100,1000): 8 | a = i//100 9 | b = (i-a*100)//10 10 | c = (i-a*100-b*10) 11 | 12 | if i == pow(a,3)+pow(b,3)+pow(c,3): 13 | print(i) -------------------------------------------------------------------------------- /2.Base_基础/2.8_杨辉三角.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 问题描述 3 | 杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。 4 | 5 | 它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加 6 |    7 | 下面给出了杨辉三角形的前4行: 8 | 9 | 1 10 | 1 1 11 | 1 2 1 12 | 1 3 3 1 13 | 14 |    15 | 给出n,输出它的前n行。 16 | 输入格式 17 | 输入包含一个数n。 18 | 19 | 输出格式 20 | 输出杨辉三角形的前n行。每一行从这一行的第一个数开始依次输出,中间使用一个空格分隔。请不要在前面输出多余的空格。 21 | 22 | 样例输入 23 | 4 24 | 25 | 样例输出 26 | 1 27 | 1 1 28 | 1 2 1 29 | 1 3 3 1 30 | ''' 31 | def yanghui(): 32 | line = [1] 33 | while True: 34 | yield line 35 | line = [1] + [line[i] + line[i + 1] for i in range(len(line) - 1)] + [1] 36 | 37 | 38 | def run(): 39 | n = int(input()) 40 | flag = 0 41 | 42 | for i in yanghui(): 43 | #print(i) 44 | print(" ".join(str(j) for j in i)) 45 | flag += 1 46 | if flag == n: 47 | break 48 | 49 | 50 | if __name__ == '__main__': 51 | run() 52 | # line=[1]+[1] 53 | # print(line) -------------------------------------------------------------------------------- /2.Base_基础/2.9_查找整数.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 问题描述 3 | 给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。 4 | 5 | 输入格式 6 | 第一行包含一个整数n。 7 | 8 | 第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。 9 | 10 | 第三行包含一个整数a,为待查找的数。 11 | 12 | 输出格式 13 | 如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1。 14 | 样例输入 15 | 6 16 | 1 9 4 8 3 9 17 | 9 18 | 样例输出 19 | 2 20 | 数据规模与约定 21 | 1 <= n <= 1000。 22 | ''' 23 | n = int(input()) 24 | arr = input().split() 25 | a = input() 26 | i = 0 27 | for x in arr: 28 | if x == a: 29 | print(i+1) 30 | break 31 | i+=1 32 | if i == n: 33 | print(-1) -------------------------------------------------------------------------------- /3.提高/3.1_预测身高.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 问题描述: 3 |   生理卫生老师在课堂上娓娓道来: 4 |   你能看见你未来的样子吗?显然不能。但你能预测自己成年后的身高,有公式: 5 |   男孩成人后身高=(父亲身高+母亲身高)/21.08 6 |   女孩成人后身高=(父亲身高0.923+母亲身高)/2 7 |   数学老师听见了,回头说:这是大样本统计拟合公式,准确性不错。 8 |   生物老师听见了,回头说:结果不是绝对的,影响身高的因素很多,比如营养、疾病、体育锻炼、睡眠、情绪、环境因素等。 9 |   老师们齐回头,看见同学们都正在预测自己的身高。 10 |   毛老师见此情形,推推眼镜说:何必手算,编程又快又简单… 11 |   约定: 12 |   身高的单位用米表示,所以自然是会有小数的。 13 |   男性用整数1表示,女性用整数0表示。 14 |   预测的身高保留三位小数 15 | 输入格式 16 |   用空格分开的三个数,整数 小数 小数 17 |   分别表示:性别 父亲身高 母亲身高 18 | 输出格式 19 |   一个小数,表示根据上述表示预测的身高(保留三位小数) 20 | 样例输入 21 | 1 1.91 1.70 22 | 样例输出 23 | 1.949 24 | 样例输入 25 | 0 1.00 2.077 26 | 样例输出 27 | 1.500 28 | 数据规模和约定 29 |   父母身高范围(0,3] 30 |   时间限制1.0秒 31 | ''' 32 | 33 | gender, father_height, mother_height = map(float, input().split()) 34 | if gender == 1: 35 | height = (father_height + mother_height) / 2 * 1.08 36 | else: 37 | height = (father_height * 0.923 + mother_height)/2 38 | print('%.3f' % height) 39 | -------------------------------------------------------------------------------- /3.提高/3.2_最长滑雪道.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 问题描述 3 |   小袁非常喜欢滑雪, 因为滑雪很刺激。为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。 小袁想知道在某个区域中最长的一个滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。如下: 4 |    5 | 一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-…-3-2-1更长。事实上,这是最长的一条。 6 |   你的任务就是找到最长的一条滑坡,并且将滑坡的长度输出。 滑坡的长度定义为经过点的个数,例如滑坡24-17-16-1的长度是4。 7 | 输入格式 8 |   输入的第一行表示区域的行数R和列数C(1<=R, C<=10)。下面是R行,每行有C个整数,依次是每个点的高度h(0<= h <=10000)。 9 | 输出格式 10 |   只有一行,为一个整数,即最长区域的长度。 11 | 样例输入 12 | 5 5 13 | 1 2 3 4 5 14 | 16 17 18 19 6 15 | 15 24 25 20 7 16 | 14 23 22 21 8 17 | 13 12 11 10 9 18 | 样例输出 19 | 25 20 | 21 | ''' 22 | 23 | def dfs(x, y): 24 | max_height = 1 25 | if dp[x][y] > 0: 26 | return dp[x][y] 27 | for k in range(4): 28 | tx = x + next_[k][0] 29 | ty = y + next_[k][1] 30 | if tx < 0 or tx >= row or ty < 0 or ty >= col: 31 | continue 32 | if arr[tx][ty] >= arr[x][y]: 33 | continue 34 | max_height = max(max_height, dfs(tx, ty) + 1) 35 | dp[x][y] = max_height 36 | 37 | return dp[x][y] 38 | row, col = map(int, input().split()) 39 | dp = [[0 for _ in range(col)] for _ in range(row)] 40 | arr = [list(map(int, input().split())) for _ in range(row)] 41 | next_ = [[0, 1], [1, 0], [0, -1], [-1, 0]] 42 | 43 | ans = 0 44 | for i in range(row): 45 | for j in range(col): 46 | ans = max(ans, dfs(i, j)) 47 | 48 | print(ans) -------------------------------------------------------------------------------- /3.提高/3.3_k好数.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 问题描述 3 | 4 | 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数。求L位K进制数中K好数的数目。例如K = 4,L = 2的时候,所有K好数为11、13、20、22、30、31、33 共7个。由于这个数目很大,请你输出它对1000000007取模后的值。 5 | 输入格式 6 | 7 | 输入包含两个正整数,K和L。 8 | 输出格式 9 | 输出一个整数,表示答案对1000000007取模后的值。 10 | 样例输入 11 | 4 2 12 | 样例输出 13 | 7 14 | 数据规模与约定 15 | 16 | 对于30%的数据,KL <= 106; 17 | 18 | 对于50%的数据,K <= 16, L <= 10; 19 | 20 | 对于100%的数据,1 <= K,L <= 100。 21 | ''' 22 | 23 | def count(legth, kind, ans): 24 | for i in range(1, kind): 25 | dp[0][i] = 1 26 | for i in range(1, legth): 27 | for j in range(kind): 28 | for k in range(kind): 29 | if abs(j - k) != 1: 30 | if j - 1 == 0 and k == 0: 31 | continue 32 | dp[i][j] = dp[i][j] + dp[i - 1][k] 33 | dp[i][j] %= MOD 34 | for i in range(kind): 35 | # print(dp[legth - 1][i]) 36 | ans += dp[legth - 1][i] 37 | ans %= MOD 38 | return ans 39 | 40 | K, L = map(int, input().split()) 41 | ans = 0 42 | MOD = 1000000007 43 | dp = [[0 for _ in range(max(L, K))] for _ in range(max(L, K))] 44 | if K == 1 and L == 1: 45 | print(0) 46 | elif K > 1 and L == 1: 47 | print(K) 48 | elif L > 1: 49 | print(count(L, K, ans)) 50 | # for i in range(K): 51 | # for j in range(K): 52 | # print(dp[i][j],end='') 53 | # print() 54 | 55 | # MOD = 1000000007 56 | # K, L = map(int, input().split()) 57 | # if K == 1 and L == 1: 58 | # print(0) 59 | # exit() 60 | # elif K > 1 and L == 1: 61 | # print(K) 62 | # exit() 63 | # num = [[0 for i in range(L)] for j in range(K)] 64 | # 65 | # for i in range(K): 66 | # num[i][0]=1 67 | # for j in range(L-1): 68 | # for i in range(K): 69 | # tmp = 0 70 | # for k in range(K): 71 | # if k == i or abs(k-i) != 1: 72 | # tmp += num[k][j] 73 | # tmp %= MOD 74 | # num[i][j+1] = tmp 75 | # ans = 0 76 | # for i in range(1, K): 77 | # ans += num[i][L-1] 78 | # ans %= MOD 79 | # print(ans) 80 | -------------------------------------------------------------------------------- /4.真题/4.1_不同子串.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 一个字符串的非空子串是指字符串中长度至少为 1 的连续的一段字符组成 的串。 3 | 例如,字符串aaab 有非空子串a, b, aa, ab, aaa, aab, aaab,一共 7 个。 4 | 注意在计算时,只算本质不同的串的个数。 5 | 6 | 请问,字符串0100110001010001 有多少个不同的非空子串? 7 | 8 | ''' 9 | var = '0100110001010001' 10 | var = 'aaab' 11 | # print("测试", var[0:16]) 12 | length = len(var) 13 | result = [] 14 | sum = 0 15 | # i :为步长 16 | for i in range(length): 17 | for j in range(length - i + 1): 18 | # print(var[j:j+i]) 19 | if var[j:j+i] in result: 20 | continue 21 | else: 22 | result.append(var[j:j+i]) 23 | sum += 1 24 | 25 | print(sum) -------------------------------------------------------------------------------- /4.真题/4.2_年号字串.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 小明用字母A 对应数字1,B 对应2,以此类推,用Z 对应26。对于27 3 | 以上的数字,小明用两位或更长位的字符串来对应,例如AA 对应27,AB 对 4 | 应28,AZ 对应52,LQ 对应329。 5 | 请问2019 对应的字符串是什么? 6 | ''' 7 | string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 8 | ans = [0 for _ in range(5)] 9 | index = 0 10 | n = 2019 11 | while n != 0: 12 | t = n % 26 13 | n = int(n / 26) 14 | ans[index] = string[t - 1] 15 | index += 1 16 | for i in range(index - 1, -1, -1): 17 | print(ans[i], end='') -------------------------------------------------------------------------------- /4.真题/4.3_数列求值.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 【问题描述】 3 | 给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和。求第 20190324 项的最后 4 位数字。 4 | 【答案提交】 5 | 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个 4 位整数(提示:答案的千位不为 0),在提交答案时只填写这个整数,填写多余的内容将无法得分。 6 | 7 | ''' 8 | arr = [0 for _ in range(20190325)] 9 | arr[0] = arr[1] = arr[2] = 1 10 | for i in range(3, 20190324): 11 | arr[i] = (arr[i - 1] + arr[i - 2] + arr[i - 3]) % 10000 12 | 13 | print(arr[20190323]) -------------------------------------------------------------------------------- /4.真题/4.4_数的分解.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包含数字 2 和 4,一共有多少种不同的分解方法? 3 | 4 | 注意交换 3 个整数的顺序被视为同一种方法,例如 1000+1001+18 和 1001+1000+18 被视为同一种。 5 | ''' 6 | count = 0 7 | 8 | def check(x): 9 | while x != 0: 10 | t = x % 10 11 | x = int(x / 10) 12 | if t == 2 or t ==4: 13 | return False 14 | return True 15 | 16 | for i in range(1, 2019): 17 | if check(i): 18 | for j in range(i+1, 2019): 19 | if check(j): 20 | k = 2019 - i - j 21 | if k > j and check(k): 22 | count += 1 23 | print(i, j, k) 24 | print(count) -------------------------------------------------------------------------------- /4.真题/4.6_特别数的和.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 3 | ''' 4 | n = int(input()) 5 | s = 0 6 | for i in range(1, n + 1): 7 | a = i 8 | while a != 0: 9 | temp = a % 10 10 | a = int(a/10) 11 | if temp in [2, 0, 1, 9]: 12 | s += i 13 | flag = True 14 | break 15 | 16 | print(s) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Blue_Bridge_Cup_Python 2 | 蓝桥杯Python练习系统题库 3 | --------------------------------------------------------------------------------