1 条题解

  • 0
    @ 2025-9-16 21:44:50

    核心逻辑

    1. 输入处理:读取以0结尾的签到字符串,提取0之前的所有名字(按空格分割)。
    2. 统计LP:需同时记录两个信息——名字的首次出现顺序(用于输出顺序)和出现次数(即LP值)。
    3. 输出结果:按名字首次出现的顺序,输出每个名字及其对应的LP值(每个名字仅输出一次)。

    代码实现(依旧推荐Cpp

    C

    #include <stdio.h>
    #include <string.h>
    
    #define MAX_NAME 11  // 包含结束符
    #define MAX_PEOPLE 20
    
    int main() {
        char names[MAX_PEOPLE][MAX_NAME] = {0};
        int lp[MAX_PEOPLE] = {0};
        int count = 0;
        char curr_name[MAX_NAME];
    
        // 逐个读取名字,直到遇到0或输入结束
        while (scanf("%s", curr_name) == 1) {
            // 遇到终止符0则停止处理
            if (strcmp(curr_name, "0") == 0) break;
    
            // 查找名字是否已存在
            int pos = -1;
            for (int i = 0; i < count; i++) 
                if (strcmp(names[i], curr_name) == 0) { pos = i; break; }
            
            // 更新LP值
            if (pos != -1) lp[pos]++; // 出现过的名字
            else if (count < MAX_PEOPLE) { // 未出现过的名字
                strcpy(names[count], curr_name);
                lp[count++] = 1;
            }
        }
    
        // 按首次出现顺序输出结果
        for (int i = 0; i < count; i++) {
            printf("%s %d\n", names[i], lp[i]);
        }
    
        return 0;
    }
    

    C++

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        string name;
    
        vector<string> order;  // 记录名字首次出现顺序
        unordered_map<string, int> lp_count;  // 名字→LP的映射
    
        while (cin >> name) {
            if (name == "0") break;  // 遇到0停止
    
            // 新名字:加入顺序列表
            if (lp_count.find(name) == lp_count.end()) order.push_back(name);
            
            lp_count[name]++; 
        }
    
        // 按顺序输出
        for (const string& n : order) {
            cout << n << " " << lp_count[n] << endl;
        }
    
        return 0;
    }
    
    

    Python

    # 读取输入并分割为列表
    parts = input().strip().split()
    
    # 截取'0'之前的所有名字
    names = parts[:parts.index('0')]
    
    # 统计LP(Python 3.7+字典保持插入顺序)
    lp_dict = {}
    for name in names:
        if name not in lp_dict:
            lp_dict[name] = 1
        else:
            lp_dict[name] += 1
    
    # 按首次出现顺序输出
    for name, lp in lp_dict.items():
        print(f"{name} {lp}")
    

    验证(样例输入)

    输入:Sherry David David Sherry David Sherry Sherry John John Alexander 0

    1. 提取名字列表:['Sherry', 'David', 'David', 'Sherry', 'David', 'Sherry', 'Sherry', 'John', 'John', 'Alexander']
    2. 统计LP:
      • Sherry出现4次,David3次,John2次,Alexander1次
    3. 按首次出现顺序输出,与样例结果完全一致。

    所有代码均满足“按首次出现顺序统计+输出”的核心需求,且高效处理输入限制(如2e5字符长度、20个不同同学)。

    • 1

    信息

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