1 条题解
-
0
📝 题目大意
给定一个长度为 的字符串,由字符
A和T组成,分别表示 A 和 T 赢得一轮比赛。最终胜者是胜场数更多的一方;若胜场数相同,则先达到该胜场数的一方获胜。输出胜方字符。💡 解题思路
-
题目分析:,数据范围很小,可以直接模拟。胜负判定分两步:先比较总胜场数,若不同则胜场多者胜;若相同则考察谁先达到这个胜场数。
-
算法推导:
- 遍历字符串,统计
T的胜场数x和A的胜场数y(对应标准代码中的x和y)。 - 若
x > y,输出T;若y > x,输出A。 - 若
x == y,记m = x(双方最终胜场数),然后从头重新遍历:- 重置计数器
x = 0, y = 0,逐字符累加。 - 当某一方的计数器率先达到
m时,该方即为胜者,输出并结束程序。
- 重置计数器
- 遍历字符串,统计
-
边界与细节:
- 时,直接比较胜场数即可,不会进入平局分支。
- 平局时"先达到"的判断必须从头开始逐字符累加,不能直接检查字符串中最后一个胜场的位置——因为可能某一方先达到 胜,但后续又被对方追平(如样例 2
ATTATA,A 先到 3 胜但 T 后来也到了 3 胜,此时按规则是先到 3 胜者胜,即 T 胜出)。 - 注意标准代码中
s数组从下标 1 开始存储,循环也从 1 开始。
⏱️ 复杂度分析
- 时间复杂度:,最多遍历字符串两遍。
- 空间复杂度:,用于存储输入字符串。
💻 标准代码 (C++)
#include<bits/stdc++.h> using namespace std; int main(){ int n, x = 0, y = 0, m; cin >> n; char s[105]; // 从下标 1 开始读入字符串 for(int i = 1; i <= n; i++) cin >> s[i]; // 第一遍遍历:统计 A 和 T 的总胜场 for(int i = 1; i <= n; i++){ if(s[i] == 'T') x++; // T 的胜场 else y++; // A 的胜场 } // 比较总胜场,多者胜 if(x > y) cout << "T"; else if(y > x) cout << "A"; else{ // 平局:记录双方最终胜场数 m m = x; int x = 0, y = 0; // 重置计数器,从头开始 // 第二遍遍历:谁先达到 m 胜谁就获胜 for(int i = 1; i <= n; i++){ if(s[i] == 'T') x++; else y++; if(x == m){ // T 先达到 m 胜 cout << "T"; return 0; } else if(y == m){ // A 先达到 m 胜 cout << "A"; return 0; } } } return 0; } -
- 1
信息
- ID
- 707
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者