1 条题解
-
0
📝 题目大意
给定一个 的字符矩阵,每个格子为
.或T。每次操作可以将同一行中相邻的两个T替换为P和C。求在操作次数最大化的情况下,最终矩阵的一种可能结果。💡 解题思路
-
题目分析:
- 操作限定在同一行内,各行之间相互独立,因此可以逐行处理。
- 每次操作消耗两个相邻的
T,将其变为P C(P在左,C在右)。操作后这两个格子不再参与后续操作。 - 数据范围 ,非常小, 暴力即可。
-
算法推导:
- 对每一行 ,从左到右扫描 :
- 若
T,则执行操作:令P,C。 - 操作后 额外自增
1(即j++,因为S[i][j+1]已变为C,不可能再与后续格子配对)。
- 若
- 这个贪心策略的正确性:每次操作固定消耗两个连续的
T,且P C不能再参与后续操作。从左到右贪心保证每个T尽可能与它右边的T配对,不会遗漏任何可能的配对——因为若跳过当前这对TT而尝试让第二个T与第三个T配对,并不会增加总操作次数,反而可能丢失一次操作机会。
- 对每一行 ,从左到右扫描 :
-
边界与细节:
- 当 时无法操作,直接输出原矩阵即可(代码中
j < W - 1自然跳过)。 - 注意
j++的跳步:操作后j位置变为P,j+1变为C,循环自身的j++会指向j+2,即跳过C继续检查后续位置。 - 多解任意输出即可,本题不要求唯一解。
- 当 时无法操作,直接输出原矩阵即可(代码中
⏱️ 复杂度分析
- 时间复杂度:,每个格子最多被访问一次。
- 空间复杂度:,存储整个字符矩阵。
💻 标准代码 (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
- 上传者