week2-[二维数组]排队
week2-[二维数组]排队
题目描述
班上的同学排成了 NNN 行 MMM 列的长方形队列,第 iii 行 第 jjj 列的同学身高为 Ai,jA_{i,j}Ai,j。班主任认为,如果一个长方形队列中,每一列同学都是按身高从低到高排列的,那么这样的长方形队列是美观的。现在班主任想要知道,同学们排成的长方形队列中,有多少列满足同学是按身高从低到高排列的(即这一列除第一行同学之外,每一位同学的身高都不低于该列前一行同学的身高)。
输入格式
读入包括 N+1N+1N+1 行。第一行包括 222 个整数 NNN 和 MMM,表示同学们排成的长方形队列的行数和列数。接下来 NNN 行,每行包括 MMM 个整数,表示长方形队列中每一位同学的身高。
输出格式
输出一个整数,表示同学们排成的长方形队列中,有多少列满足同学是按身高从低到高排列的。
样例 #1
样例输入 #1
3 3
132 131 138
136 133 131
138 132 135
样例输出 #1
1
样例 #2
样例输入 #2
3 5
142 135 132 137 130
135 139 134 134 135
126 127 137 135 135
样例输出 #2
2
样例 #3
样例输入 #3
4 3
125 154 143
155 134 144
143 142 134
124 135 145
样例输出 #3
0
提示
样例解释1
第 111 列同学身高是从低到高排列的。
样例解释2
第 333 列和第 555 列同学身高是从低到高排列的。
样例解释3
没有一列同学身高是完全从低到高排列的。
数据范围
对于所有数据,3≤N,M≤20,110≤Ai,j≤1903 \le N,M \le 20, 110 \le A_{i,j} \le 1903≤N,M≤20,110≤Ai,j≤190。
1. 阅读题目
题目给定一个 N×MN \times MN×M 的二维数组 AAA,表示 NNN 行 MMM 列的同学身高。
要求:统计有多少列满足 从上到下身高不下降,即对于该列 jjj,从第 2 行开始都有 Ai,j≥Ai−1,jA_{i,j} \ge A_{i-1,j}Ai,j≥Ai−1,j。
输入:
- 第一行:N,MN, MN,M
- 接下来 NNN 行:每行 MMM 个整数,表示身高
输出:
- 一个整数,表示有多少列是“非递减”的。
数据范围:3≤N,M≤203 \le N,M \le 203≤N,M≤20,110≤Ai,j≤190110 \le A_{i,j} \le 190110≤Ai,j≤190。
范围很小,可以直接暴力遍历。
2. 分析问题
- 对每一列 jjj(1≤j≤M1 \le j \le M1≤j≤M):
- 检查 i=2..Ni=2..Ni=2..N 时是否有 Ai,j≥Ai−1,jA_{i,j} \ge A_{i-1,j}Ai,j≥Ai−1,j。
- 如果整列都满足,则该列计数 +1。
- 时间复杂度:
- O(N×M)O(N \times M)O(N×M),在 20×20=40020 \times 20 = 40020×20=400 范围内,完全没问题。
边界情况:
- 所有列严格下降 → 答案是 0
- 所有列非递减 → 答案是 MMM
- 有相等情况也算“从低到高”(因为题目是“不低于”)。
3. C++ 代码实现(兼容低版本)
我写一个 C++11 安全写法(避免 auto
、vector
初始化列表、结构化绑定等),用 cin/cout
就能过。
#include <iostream>
using namespace std;int main() {ios::sync_with_stdio(false);cin.tie(NULL);int N, M;cin >> N >> M;int A[25][25]; // 题目范围 N,M <= 20,开25足够for (int i = 0; i < N; i++) {for (int j = 0; j < M; j++) {cin >> A[i][j];}}int ans = 0;// 遍历每一列for (int j = 0; j < M; j++) {bool ok = true;for (int i = 1; i < N; i++) {if (A[i][j] < A[i-1][j]) { // 不满足非递减ok = false;break;}}if (ok) ans++;}cout << ans << "\n";return 0;
}