1 条题解

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

    📝 题目大意

    NN 个人围成一圈,每人有一个名字和年龄(年龄互不相同)。从最年轻的人开始,按顺时针顺序输出所有人的名字。

    💡 解题思路

    1. 题目分析N100N \le 100,数据范围极小,直接模拟即可。年龄互不相同保证了"最年轻的人"唯一确定。输入顺序就是顺时针顺序,所以不需要额外排序。
    2. 算法推导
      • 遍历输入,同时记录最小年龄 minAge 及其对应的下标 startIdx(即最年轻的人的位置)。
      • startIdx 开始,按 (startIdx+i)modN(startIdx + i) \bmod N 的顺序依次输出名字,相当于将环形数组从起点展开。
    3. 边界与细节AiA_i 最大可达 10910^9minAge 初始值需设为足够大(如 109+1010^9+10)。N=2N=2 时模运算同样正确。

    ⏱️ 复杂度分析

    • 时间复杂度O(N)O(N),一次遍历找最小值,一次遍历输出。
    • 空间复杂度O(N)O(N),存储名字和年龄数组。

    💻 标准代码 (C++)

    #include <iostream>
    #include <vector>
    #include <string>
    using namespace std;
    int main() {
        int N;
        cin >> N;
        vector<string> name(N);
        vector<int> age(N);
        int minAge = 1e9 + 10;   // 初始化为足够大的值(年龄最大 1e9)
        int startIdx = 0;        // 最年轻的人的下标
        for (int i = 0; i < N; i++) {
            cin >> name[i] >> age[i];
            if (age[i] < minAge) {  // 找到更年轻的人
                minAge = age[i];
                startIdx = i;       // 更新起点下标
            }
        }
        // 从最年轻的人开始,顺时针输出 N 个人的名字
        for (int i = 0; i < N; i++) {
            cout << name[(startIdx + i) % N] << endl;  // 取模实现环形遍历
        }
        return 0;
    }
    
    • 1

    信息

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