1

root 站长 2024-11-21 21:40:51 2024-11-21 22:32:45 9
#include <bits/stdc++.h>
using namespace std;

int d, p, s;

struct n {
    string name;  // 姓名
    string id;    // 身份证
    string time;  // 时间
    int sx;       // 顺序
} a[1010];

vector<n> ck;  // 用来记录符合条件的申请人

map<string, int> mp, mp1;  // mp: 已发放口罩的人,mp1: 记录每人最后发放口罩的日期

// 比较函数,用于排序
int cmp(n a, n b) {
    if (a.time == b.time)
        return a.sx < b.sx;
    return a.time < b.time;
}

// 身份证号合法性检查
bool f1(string id) {
    if (id.size() != 18)
        return false;
    for (int i = 0; i < 18; i++) {
        if (id[i] < '0' || id[i] > '9')
            return false;
    }
    return true;
}

// 发放口罩的处理逻辑
void give(int j, int day) {
    if (s < 1)
        return;

    if (!mp1.count(a[j].id)) {
        cout << a[j].name << ' ' << a[j].id << "\n";
        mp1[a[j].id] = day;
        s--;
    } else {
        if (day > mp1[a[j].id] + p) {
            cout << a[j].name << ' ' << a[j].id << "\n";
            mp1[a[j].id] = day;
            s--;
        }
    }
}

// 主要处理逻辑
void f() {
    cin >> d >> p;
    int t;

    // 遍历每一天的申请数据
    for (int i = 0; i < d; i++) {
        cin >> t >> s;

        for (int j = 0; j < t; j++) {
            a[j].sx = j;
            cin >> a[j].name >> a[j].id;
            int if_;
            cin >> if_;  // 是否符合发放条件(1 表示符合)

            if (if_ && !mp.count(a[j].id) && f1(a[j].id)) {
                mp[a[j].id] = 1;     // 记录该身份证已经申请过口罩
                ck.push_back(a[j]);  // 添加到符合条件的申请人队列
            }
            cin >> a[j].time;  // 申请的时间
        }

        // 按时间排序(同时间按原顺序)
        sort(a, a + t, cmp);

        // 发放口罩的处理
        for (int j = 0; j < t; j++) {
            if (f1(a[j].id)) {
                give(j, i);
            }
        }
    }

    // 输出所有符合条件的有症状的申请人信息
    for (int i = 0; i < ck.size(); i++) {
        cout << ck[i].name << " " << ck[i].id << "\n";
    }
    return;
}

int main(void) {
    f();
    return 0;
}
{{ vote && vote.total.up }}

共 1 条回复

root 站长

@ykj46 这个代码