noip2015普及组复赛试题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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取模。

相关文档
最新文档