1 条题解

  • 0
    @ 2026-6-19 10:30:30

    📝 题目大意

    给定一个 H×WH \times W 的字符矩阵,每个格子为 .T。每次操作可以将同一行中相邻的两个 T 替换为 PC。求在操作次数最大化的情况下,最终矩阵的一种可能结果。

    💡 解题思路

    1. 题目分析

      • 操作限定在同一行内,各行之间相互独立,因此可以逐行处理。
      • 每次操作消耗两个相邻的 T,将其变为 P CP 在左,C 在右)。操作后这两个格子不再参与后续操作。
      • 数据范围 H,W100H, W \leq 100,非常小,O(HW)O(HW) 暴力即可。
    2. 算法推导

      • 对每一行 ii,从左到右扫描 j=0W2j = 0 \sim W-2
        • S[i][j]=S[i][j+1]=S[i][j] = S[i][j+1] = T,则执行操作:令 S[i][j]=S[i][j] = PS[i][j+1]=S[i][j+1] = C
        • 操作后 jj 额外自增 1(即 j++,因为 S[i][j+1] 已变为 C,不可能再与后续格子配对)。
      • 这个贪心策略的正确性:每次操作固定消耗两个连续的 T,且 P C 不能再参与后续操作。从左到右贪心保证每个 T 尽可能与它右边的 T 配对,不会遗漏任何可能的配对——因为若跳过当前这对 TT 而尝试让第二个 T 与第三个 T 配对,并不会增加总操作次数,反而可能丢失一次操作机会。
    3. 边界与细节

      • W=1W=1 时无法操作,直接输出原矩阵即可(代码中 j < W - 1 自然跳过)。
      • 注意 j++ 的跳步:操作后 j 位置变为 Pj+1 变为 C,循环自身的 j++ 会指向 j+2,即跳过 C 继续检查后续位置。
      • 多解任意输出即可,本题不要求唯一解。

    ⏱️ 复杂度分析

    • 时间复杂度O(H×W)O(H \times W),每个格子最多被访问一次。
    • 空间复杂度O(H×W)O(H \times W),存储整个字符矩阵。

    💻 标准代码 (C++)

    #include <iostream>
    #include <vector>
    #include <string>
    using namespace std;
    
    int main() {
        int H, W;
        cin >> H >> W;
        vector<string> S(H);
        for (int i = 0; i < H; i++) {
            cin >> S[i];                    // 读入 H 行字符串
        }
        for (int i = 0; i < H; i++) {       // 逐行处理,各行独立
            for (int j = 0; j < W - 1; j++) {
                if (S[i][j] == 'T' && S[i][j + 1] == 'T') {
                    // 找到相邻的两个 T,替换为 P 和 C
                    S[i][j] = 'P';
                    S[i][j + 1] = 'C';
                    j++;                    // 跳过已变为 C 的位置,继续向右扫描
                }
            }
        }
        for (int i = 0; i < H; i++) {
            cout << S[i] << endl;           // 输出结果
        }
        return 0;
    }
    
    • 1

    信息

    ID
    702
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者