1 条题解
-
0
核心逻辑
- 输入处理:读取以
0结尾的签到字符串,提取0之前的所有名字(按空格分割)。 - 统计LP:需同时记录两个信息——名字的首次出现顺序(用于输出顺序)和出现次数(即LP值)。
- 输出结果:按名字首次出现的顺序,输出每个名字及其对应的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- 提取名字列表:
['Sherry', 'David', 'David', 'Sherry', 'David', 'Sherry', 'Sherry', 'John', 'John', 'Alexander'] - 统计LP:
- Sherry出现4次,David3次,John2次,Alexander1次
- 按首次出现顺序输出,与样例结果完全一致。
所有代码均满足“按首次出现顺序统计+输出”的核心需求,且高效处理输入限制(如2e5字符长度、20个不同同学)。
- 输入处理:读取以
- 1
信息
- ID
- 495
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- (无)
- 递交数
- 19
- 已通过
- 7
- 上传者