T1: 矩阵涂色
本题难度简单,考察二维数组的基本使用。
矩阵最终状态中,如果某一行全是红色,说明最后一次操作是 R
操作,如果某一列全是蓝色,说明最后一次操作一定是 B
操作
代码实现
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
using namespace std;
void solve() {
int n;
cin >> n;
vector<string> s(n);
rep(i, n) cin >> s[i];
char ans = 'B';
rep(i, n) {
bool ok = true;
rep(j, n) {
if (s[i][j] != 'R') ok = false;
}
if (ok) ans = 'R';
}
cout << ans << '\n';
}
int main() {
int t;
cin >> t;
while (t--) solve();
return 0;
}
T2: 最大X型和
本题难度简单,考察二维数组行、列、对角线上的元素基本操作和预处理思想。
\(70\) 分做法:
枚举每一个位置,然后计算四个方向所有元素的和,取最大值即可。
\(100\) 分做法:
对于每个位置 \((i, j)\) 需要计算 \((i, j)\) 所在的主对角线和副对角线的所有元素之和。可以预处理每条主对角线元素之和、每条副对角线元素之和。在同一条主对角线上的元素的位置坐标 \((x, y)\) 满足 \(y-x\) 是定值,同理在同一条副对角线上的元素的位置坐标 \((x, y)\) 满足 \(x+y\) 是定值。
代码实现
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 1; i <= (n); ++i)
using namespace std;
int a[2005][2005], s1[4005], s2[4005];
inline void chmax(int& x, int y) { if (x < y) x = y; }
int main() {
int n, m;
cin >> n >> m;
rep(i, n)rep(j, m) cin >> a[i][j];
rep(i, n)rep(j, m) {
s1[i+j] += a[i][j];
s2[j-i+2000] += a[i][j];
}
int ans = 0;
rep(i, n)rep(j, m) {
chmax(ans, s1[i+j]+s2[j-i+2000]-a[i][j]);
}
cout << ans << '\n';
return 0;
}