1 条题解

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

    📝 题目大意

    给定一个形如 ABC + 三位数字的字符串 SS(如 ABC349),判断它是否为 AtCoder 上已结束的比赛的简称。有效范围是 ABC001ABC349,但 ABC316 因为未举办而被排除,本场比赛 ABC350 也尚未结束。

    💡 解题思路

    1. 题目分析:字符串长度固定为 66,前三位一定是 ABC,后三位是数字。由于数字部分固定为三位且带前导零(001, 002, …),字符串的字典序比较等价于数值比较。例如 "ABC010""ABC009" 的字典序关系与数值关系一致,因为所有数字位数相同。

    2. 算法推导

      • 题目要求 SS[001,349][001, 349] 范围内且 316\neq 316
      • 由于字符串比较天然支持字典序,直接判断 s >= "ABC001" && s <= "ABC349" 即可覆盖所有有效编号。
      • 再单独排除 "ABC316",注意 s != "ABC316" 必须放在与运算中,否则 ABC316 也满足范围判断。
    3. 边界与细节

      • ABC000:不在范围内,应输出 Nos >= "ABC001" 已排除。
      • ABC350 及以上:s <= "ABC349" 已排除。
      • ABC316:单独用 != 排除,注意它在 [001, 349] 范围内,不加排除会输出 Yes 导致 WA。
      • 前导零自动处理:字符串比较 "ABC005" 正确大于 "ABC001",无需转整数。

    ⏱️ 复杂度分析

    • 时间复杂度O(1)O(1),仅一次字符串比较。
    • 空间复杂度O(1)O(1),仅存储输入字符串。

    💻 标准代码 (C++)

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
    	string s;
    	cin >> s;
    	// 字符串字典序比较:由于数字部分固定 3 位且带前导零,等价于数值比较
    	// 有效范围:ABC001 ~ ABC349,但要排除 ABC316(该场比赛未举办)
    	if(s >= "ABC001" && s <= "ABC349" && s != "ABC316"){
    		cout << "Yes";
    	} else {
    		cout << "No";
    	}
    	return 0;
    }
    
    • 1

    信息

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