You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提取工号与工时并统计出月工时最长的工人?

解决思路与代码改进

核心问题分析

原代码仅读取了文件中的行内容,但未从固定格式的字符串中提取关键的工号(x)和工时(y)。由于输入行格式固定为「Worker x worked y hours.」,我们可以利用C++输入流的特性,直接跳过无关字符串,精准提取数字信息。

具体实现步骤

  • 数据存储:工号范围为1-10000,使用数组存储每个工人的总工时最为高效(数组索引对应工号,值对应总工时);若工号不连续,也可使用map<int, int>动态存储。
  • 输入解析:针对每一行,通过cin依次读取固定无关字符串(如"Worker"、"worked"),直接提取工号和工时数字。
  • 计算最大值:遍历存储容器,找出总工时最大的工号。

改进后的完整代码

#include <iostream>
#include <fstream>
using namespace std;

const int MAX_WORKER = 10001; // 工号范围1-10000,数组开10001避免越界

int main() {
    ifstream fin("date.in");
    int n;
    fin >> n;

    int hours[MAX_WORKER] = {0}; // 初始化所有工时为0

    string dummy; // 存储无关字符串
    int x, y;
    for (int i = 0; i < n; ++i) {
        // 按固定格式读取,跳过无关内容
        fin >> dummy >> x >> dummy >> y >> dummy;
        hours[x] += y; // 累加对应工人的工时
    }

    // 找出工时最多的工人编号
    int max_hours = 0;
    int result_worker = 0;
    for (int i = 1; i < MAX_WORKER; ++i) {
        if (hours[i] > max_hours) {
            max_hours = hours[i];
            result_worker = i;
        }
    }

    cout << result_worker << endl;
    fin.close();
    return 0;
}

备选方案(用stringstream处理整行)

若坚持使用getline读取整行,可通过stringstream解析每行内容:

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
using namespace std;

const int MAX_WORKER = 10001;

int main() {
    ifstream fin("date.in");
    int n;
    fin >> n;
    fin.ignore(); // 忽略n后的换行符,避免第一个getline读取空行

    int hours[MAX_WORKER] = {0};
    string line;
    for (int i = 0; i < n; ++i) {
        getline(fin, line);
        stringstream ss(line);
        string dummy;
        int x, y;
        ss >> dummy >> x >> dummy >> y >> dummy;
        hours[x] += y;
    }

    int max_hours = 0, result = 0;
    for (int i = 1; i < MAX_WORKER; ++i) {
        if (hours[i] > max_hours) {
            max_hours = hours[i];
            result = i;
        }
    }

    cout << result << endl;
    fin.close();
    return 0;
}

关键说明

  • 数组存储的优势是访问速度快,适合工号范围明确的场景;若工号范围不确定,替换为map<int, int>即可。
  • 注意fin >> n会在输入流中留下换行符,需用fin.ignore()或读取空行的方式避免后续读取错误。

内容的提问来源于stack exchange,提问作者popescubianca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 17:46:00