CCF GESP 2025年9月认证 C++ 4级

编程题
共 2 道 每题 25 分 共计 50 分
第 1 题
排兵布阵
时间限制:1s 内存限制:512MB

题目描述

作为将军,你自然需要合理地排兵布阵。地图可以视为 $n$ 行 $m$ 列的网格,适合排兵的网格以 1 标注,不适合排兵的网格以 0 标注。现在你需要在地图上选择一个矩形区域排兵,这个矩形区域内不能包含不适合排兵的网格。请问可选择的矩形区域最多能包含多少网格?

输入格式

第一行,两个正整数 $n, m$,分别表示地图网格的行数与列数。

接下来 $n$ 行,每行 $m$ 个整数 $a_{i,1}, a_{i,2}, \ldots, a_{i,m}$,表示各行中的网格是否适合排兵。

输出格式

一行,一个整数,表示适合排兵的矩形区域包含的最大网格数。

样例说明

样例 1

输入:
4 3
0 1 1
1 0 1
0 1 1
1 1 1
输出:
4

样例 2

输入:
3 5
1 0 1 0 1
0 1 0 1 0
0 1 1 1 0
输出:
3

数据范围

对于所有测试点,保证 $1 \leq n, m \leq 12$,$0 \leq a_{i,j} \leq 1$。

第 2 题
最长连续段
时间限制:1s 内存限制:512MB

题目描述

对于 $k$ 个整数构成的数组 $[b_1, b_2, \ldots, b_k]$,如果对 $1 \leq i < k$ 都有 $b_{i+1} = b_i + 1$,那么称数组 $b$ 是一个连续段。

给定由 $n$ 个整数构成的数组 $[a_1, a_2, \ldots, a_n]$,你可以任意重排数组 $a$ 中元素顺序。请问在重排顺序之后,$a$ 所有是连续段的子数组中,最长的子数组长度是多少?

例如,对于数组 $[1, 0, 2, 4]$,可以将其重排为 $[4, 0, 1, 2]$,有以下 $10$ 个子数组:

$$[4], [0], [1], [2], [4, 0], [0, 1], [1, 2], [4, 0, 1], [0, 1, 2], [4, 0, 1, 2]$$

其中除 $[4, 0], [4, 0, 1], [4, 0, 1, 2]$ 以外的子数组均是连续段,因此是连续段的子数组中,最长子数组长度为 3。

输入格式

第一行,一个正整数 $n$,表示数组长度。

第二行,$n$ 个整数 $a_1, a_2, \ldots, a_n$,表示数组中的整数。

输出格式

一行,一个整数,表示数组 $a$ 重排顺序后,所有是连续段的子数组的最长长度。

样例说明

样例 1

输入:
4
1 0 2 4
输出:
3

样例 2

输入:
9
9 9 8 2 4 4 3 5 3
输出:
4

数据范围

对于 $40\%$ 的测试点,保证 $1 \leq n \leq 8$。

对于所有测试点,保证 $1 \leq n \leq 10^5$,$-10^9 \leq a_i \leq 10^9$。

编程题部分已到底了。