noip2015普及组复赛试题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
noip2015普及组复赛试题
题目一:矩阵运算
给定一个n阶方阵A(1 ≤ n ≤ 100),求A的所有指定行指定列删除后得到的新矩阵的行列式。
输入格式:
输入第一行包含一个整数n,表示方阵的阶数。
接下来n行,每行包含n个整数,表示方阵A的元素。
接下来一行包含两个整数,表示要删除的行和列的序号。
输出格式:
输出一个整数,表示新矩阵的行列式的值。
题目要求:
首先,我们需要编写一个能够计算矩阵行列式的函数,然后根据题意进行修改,使其能够处理删除指定行列后的新矩阵,并返回新矩阵的行列式的值。
算法思路:
我们可以使用拉普拉斯展开定理来计算矩阵行列式的值。首先定义一个变量result,初始化为0。然后遍历矩阵的第一行元素,对于第i 个元素,根据其正负性,计算其余元素组成的(n-1)阶子矩阵的行列式
的值,并递归调用自身。最后将每个元素计算得到的行列式值乘以其对应的元素,累加到result上。
然后根据题目要求,在计算每个元素对应的子矩阵时,判断是否需要删除指定的行列。如果需要删除,则直接跳过该行列,否则继续计算。
代码如下:
```python
def determinant(matrix):
n = len(matrix)
if n == 1:
return matrix[0][0]
result = 0
for i in range(n):
if n > 2:
sub_matrix = [row[:i] + row[i+1:] for row in matrix[1:]]
else:
sub_matrix = matrix[1:]
det = determinant(sub_matrix)
result += (-1) ** i * matrix[0][i] * det
return result
n = int(input())
matrix = []
for _ in range(n):
row = list(map(int, input().split()))
matrix.append(row)
row, col = map(int, input().split())
matrix = [matrix[i][:col] + matrix[i][col+1:] for i in range(row)] # 删除
指定列
matrix = matrix[:row] + matrix[row+1:] # 删除指定行
result = determinant(matrix)
print(result)
```
题目二:水果分配
小明和他的朋友们买了n个水果,其中有x个苹果和y个香蕉。他
们打算将这些水果分配给每个人,并保证每个人既可以分到苹果又可
以分到香蕉。小明和他的朋友们各自都想得到x/2个苹果和y/2个香蕉,请计算最多能够将水果均匀分配给多少个人。
输入格式:
输入包含三个整数n,x和y,分别表示水果的总数,苹果的个数和
香蕉的个数。
输出格式:
输出一个整数,表示最多能够将水果均匀分配给多少个人。
题目要求:
我们需要首先判断总水果数是否为偶数,若为奇数则无法均分,直
接输出0。否则,我们需要判断苹果和香蕉的个数是否同时为偶数,若有一方为奇数,则需要减去1,使其为偶数,以便能够正好平均分配给每个人。然后,我们只需要取苹果和香蕉个数的较小值作为计算结果。
代码如下:
```python
n, x, y = map(int, input().split())
if n % 2 != 0:
print(0)
else:
if x % 2 != 0 or y % 2 != 0:
x -= 1
y -= 1
result = min(x//2, y//2)
print(result)
```
题目三:数列求和
给定一个长度为n的数列A,你需要求出满足以下条件的数列B的和:
1. 数列B的长度为n;
2. 数列B每个元素的值为连续两个数列A的元素的和;
3. 数列B的首尾元素的值为数列A的首尾元素的值。
输入格式:
输入第一行包含一个整数n,表示数列A的长度。
输入第二行包含n个整数,表示数列A的元素。
输出格式:
输出一个整数,表示数列B的和。
题目要求:
我们可以使用两个指针,分别指向数列A的前一个元素和当前元素,然后遍历数列A的每个元素,计算每个元素与前一个元素的和,并将
其累加到结果上。
代码如下:
```python
n = int(input())
numbers = list(map(int, input().split()))
result = numbers[0] + numbers[-1] # 首尾元素和
previous = numbers[0]
current = numbers[1]
for i in range(1, n-1):
current_sum = previous + current
result += current_sum
previous = current
current = numbers[i+1]
print(result)
```
题目四:路径统计
给定一个n×m的迷宫,迷宫中的每个单元格要么是空地(用0表示),要么是障碍物(用1表示)。小明从迷宫的左上角(1, 1)出发,他的目标是到达迷宫的右下角(n, m)。在每一步中,他可以向下走一步或向右走一步,当然,前提是小明所在的单元格不是障碍物。请计算小明达到目标的不同路径数,结果对1000000007取模。