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) 满足 yx 是定值,同理在同一条副对角线上的元素的位置坐标 (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;
}