1 条题解

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

    📝 题目大意

    给定一个长度为 NN 的字符串,由字符 AT 组成,分别表示 A 和 T 赢得一轮比赛。最终胜者是胜场数更多的一方;若胜场数相同,则先达到该胜场数的一方获胜。输出胜方字符。

    💡 解题思路

    1. 题目分析N100N \le 100,数据范围很小,可以直接模拟。胜负判定分两步:先比较总胜场数,若不同则胜场多者胜;若相同则考察谁先达到这个胜场数。

    2. 算法推导

      • 遍历字符串,统计 T 的胜场数 xA 的胜场数 y(对应标准代码中的 xy)。
      • x > y,输出 T;若 y > x,输出 A
      • x == y,记 m = x(双方最终胜场数),然后从头重新遍历:
        • 重置计数器 x = 0, y = 0,逐字符累加。
        • 当某一方的计数器率先达到 m 时,该方即为胜者,输出并结束程序。
    3. 边界与细节

      • N=1N = 1 时,直接比较胜场数即可,不会进入平局分支。
      • 平局时"先达到"的判断必须从头开始逐字符累加,不能直接检查字符串中最后一个胜场的位置——因为可能某一方先达到 mm 胜,但后续又被对方追平(如样例 2 ATTATA,A 先到 3 胜但 T 后来也到了 3 胜,此时按规则是先到 3 胜者胜,即 T 胜出)。
      • 注意标准代码中 s 数组从下标 1 开始存储,循环也从 1 开始。

    ⏱️ 复杂度分析

    • 时间复杂度O(N)O(N),最多遍历字符串两遍。
    • 空间复杂度O(N)O(N),用于存储输入字符串。

    💻 标准代码 (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
    上传者