第一题 边长为n的正方形,横竖切共计k刀,要求切的每个矩形大小项目,求矩形的面积,保留两位小数 打卡题,直接横切k//2刀,竖切k-k//2刀 n, k = [int(item) for item in input().split()]def f(n, k): x = k//2 y = k - x return n*n/(x+1)/(y+1)print("%.2f" % round(f(n, k),2)) 第二题 t个测试用例,输入两个2*2的01矩阵a和b,每步交换相邻的两个元素,求a->b的步数 思路是求两个矩阵mat1,mat2的和sum1,sum2,如果不相等返回-1,mat1==mat2返回0,剩下的只有sum1==1,sum1==2,sum1==3三种情况,求mat=mat1+mat2 sum1==1mat会有[[1 0][0 1]] [[1 1][0 0]] [[1 0][1 0]]的情况,对行列分别求和,和存在2的情况只用交换1次,其他情况交换2次 sum1==2mat会有[[1 1][1 1]] [[2 1][1 0]] [[2 0][1 1]]的情况,对行列分别求和,和存在2且不是[[1 1][1 1]]的情况只用交换1次,其他情况交换2次 和1类似,求和存在2和4的情况 def switch_time(mat1, mat2): if mat1 == mat2: return 0 sum1 = mat1[0][0] + mat1[1][0] + mat1[0][1] + mat1[1][1] sum2 = mat2[0][0] + mat2[1][0] + mat2[0][1] + mat2[1][1] if sum1 != sum2: return -1 mat = [[0, 0], [0, 0]] for i in range(2): for j in range(2): mat[i][j] = mat1[i][j] + mat2[i][j] # print(mat) if sum1 == 1: if sum(mat[0]) == 2 or sum(mat[1]) == 2 or mat[0][0]+mat[1][0] == 2 or mat[0][1]+mat[1][1] == 2: return 1 else: return 2 elif sum1 == 2: if mat[0][0] == 1 and mat[0][1] == 1 and mat[1][0] == 1 and mat[1][1] == 1: return 2 elif sum(mat[0]) == 2 or sum(mat[1]) == 2 or mat[0][0]+mat[1][0] == 2 or mat[0][1]+mat[1][1] == 2: return 1 else: return 2 else: if sum(mat[0])%2 == 0 or sum(mat[1])%2 == 0 or (mat[0][0]+mat[1][0])%2 == 0 or (mat[0][1]+mat[1][1])%2 == 0: return 1 else: return 2t = int(input())for i in range(t): mat1 = [] mat2 = [] for j in range(2): mat1.append([int(item) for item in input().split()]) for j in range(2): mat2.append([int(item) for item in input().split()]) # print(mat1, mat2) print(switch_time(mat1, mat2)) 第三题 输入t个用例,长度为n的数组nums,数组颜色colors分别是R和B和nums的数字一一对应,R只能加,B只能减,求加减之后数组的最大值-最小值 思路是先遍历一遍nums,记录r和b对应的最大值和最小值 当不存在r或b的时候,直接返回存在的颜色最大值-最小值 当r的最小值大于b的最大值的时候,这时不能改变数字大小,返回max_r - min_b 当r的最小值小于b的最大值小于r的最大值的时候,这是也不能改变数字大小,返回max_r - min(min_b,min_r) 其他情况返回r、b的范围最大值 def solve(n, nums, colors): min_r = 1000000001 max_r = 0 min_b = 1000000001 max_b = 0 flag1 = False flag2 = False for i in range(n): if colors[i] == 'R': min_r = min(min_r, nums[i]) max_r = max(max_r, nums[i]) flag1 = True if colors[i] == 'B': min_b = min(min_b, nums[i]) max_b = max(max_b, nums[i]) flag2 = True if flag1 and flag2: if min_r > max_b: return max_r - min_b if min_r < max_b < max_r: return max_r - min(min_b,min_r) return max(max_b-min_b, max_r-min_r) if flag1: return max_r-min_r if flag2: return max_b-min_bt = int(input())for i in range(t): n = int(input()) nums = [int(item) for item in input().split()] colors = input() print(solve(n, nums, colors)) 第四题 边长为n的正方形中包含1-n*n的所有数字,每个元素的权重等于周围元素的和,求矩阵权重和最大值 四个角的元素计算2次,四条边的元素计算3次,中间的元素计算4次,所以要把小的数字放在角和边上四角分别是1234,权重和为20中心的元素共有(n-2)^2,范围是(n-2)^2到n^2四边的元素共有n^2-(n-2)^2,范围是n^2-(n-2)^2-4到n^2-(n-2)^2用等差数列公式求和即可 def get_sum_arr(a1, n): return a1 * n - (n * (n-1)//2)def solve(n): center_num = 0 if n>2: center_num = get_sum_arr(n * n, (n-2)*(n-2)) * 4 edge_sum = get_sum_arr(4 * n - 4, 4 * n -8) * 3 cornner_sum = 20 return (center_num + edge_sum + cornner_sum) % 1000000007n = int(input())print(solve(n))