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;
}