1 条题解

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

    📝 题目大意

    AtCoder 王国一年有 NN 个月,第 ii 月有 DiD_i 天。若某日 iijj 日满足:iijj 的十进制表示中所有数字都相同(即全由同一个数字组成),则该日为"重复数"日。求一年中"重复数"日的总数。

    💡 解题思路

    1. 题目分析

      • 数据范围很小:N100N \le 100Di100D_i \le 100,最多 100×100=104100 \times 100 = 10^4 天,因此直接枚举每一天即可。
      • "重复数"的核心条件:月份 ii 的所有十进制位必须相同,日 jj 的所有十进制位也必须相同,且两者的数字还必须一致(如 11111111 日合法,11112222 日不合法)。
    2. 算法推导

      • 编写辅助函数 allSameDigit(x),判断一个数 xx 的所有十进制位是否相同:取出最后一位作为基准 last = x % 10,循环取余判断每一位是否等于 last
      • 双重循环枚举:外层枚举月份 monthmonth1N1 \sim N),内层枚举日期 dayday1Dmonth1 \sim D_{month})。
      • 对于每一天,判断三个条件:
        1. allSameDigit(month):月份自身所有位相同。
        2. allSameDigit(day):日期自身所有位相同。
        3. month % 10 == day % 10:月份和日期由同一个数字组成(因为前两个条件已保证各自内部一致,只需比对末位即可)。
      • 满足三者则 count++,最后输出 count
    3. 边界与细节

      • 单数字月份(191 \sim 9)和单数字日期(191 \sim 9):allSameDigit 对单数字数直接返回 true,因此如 1111 日会被正确计数。
      • 10101010 日这种:allSameDigit(10) 返回 false101 \neq 0),因此不会被错误计入。
      • 交叉验证:即便月份和日期各自都是"纯数字"(如 111111 日),还需 month % 10 == day % 10 确保二者数字一致。111111 日 → 1=11 = 1,合法;112222 日 → 121 \neq 2,不合法。

    ⏱️ 复杂度分析

    • 时间复杂度O(N×maxDi)O(N \times \max D_i),最坏 10410^4 次迭代,每次迭代常数时间。
    • 空间复杂度O(N)O(N),仅用于存储 DD 数组。

    💻 标准代码 (C++)

    #include <iostream>
    #include <string>
    using namespace std;
    
    // 判断 x 的所有十进制位是否都相同
    bool allSameDigit(int x) {
        int last = x % 10;          // 取最后一位作为基准
        while (x > 0) {
            if (x % 10 != last) return false; // 只要有不同位,直接返回 false
            x /= 10;
        }
        return true;
    }
    
    int main() {
        int N;
        cin >> N;
        int D[101];                  // 存储每个月的天数(1-indexed)
        for (int i = 1; i <= N; i++) {
            cin >> D[i];
        }
    
        int count = 0;
        for (int month = 1; month <= N; month++) {
            for (int day = 1; day <= D[month]; day++) {
                // 月份和日期各自所有位相同,且由同一个数字组成
                if (allSameDigit(month) && allSameDigit(day) && (month % 10 == day % 10)) {
                    count++;
                }
            }
        }
    
        cout << count << endl;
        return 0;
    }
    
    • 1

    信息

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