思路

  • 超级模拟
  • 存好结构体之后,直接按照两条排序要求进行排序即可
#include <bits/stdc++.h>
//#define int long long
const int N = 1e3 + 10;
using namespace std;
struct node
{
    string name, id;
    int state, idx;
    string time;
    // 构造函数
    node(string name, string id, int state, string time, int idx)
    {
        this->name = name; this->id = id;
        this->state = state; this->idx = idx;
        this->time = time;
    }
    bool operator < (const node& t ) const
    {
        if(time != t.time)
        {
            return time < t.time;
        }
        return idx < t.idx;
    }
};
// 检查身份证是否合法
int check(string id)
{
    if(id.size() != 18) return 0;
    for(int i = 0; i < id.size(); i ++)
    {
        if(isdigit(id[i]) == false) return 0;
    }
    return 1;
}
map<string, int> mpt; // 上次获得口罩的时间是第几天
map<string, int> person; // 判断这个人有没有记录过
vector<node> p1; // 记录状态为1的人
signed main()
{
    int d, p, order = 0; // order: 全部申请记录的编号
    cin >> d >> p;
    for(int i = 1; i <= d; i ++)
    {
        int t, cnt;
        cin >> t >> cnt;
        vector<node> tmp; //记录每天的申请记录
        for(int j = 0; j < t; j ++)
        {
            string id, name, time;
            int state, idx;
            cin >> name >> id >> state >> time;
            // 身份证不合法
            if(check(id) == 0) continue;
            order ++;
            idx = j;
            tmp.push_back({name, id, state, time, idx});

            // 记录状态为1的人
            if(state == 1)
            {
                if(person[id] == 0)
                {
                    p1.push_back({name, id, state, time, idx});
                    person[id] = 1;
                }
            }
        }

        // 按照提交的时间和序号进行排序
        sort(tmp.begin(), tmp.end());

        // j:发方的个数,k:遍历数组
        for(int j = 0, k = 0; j < cnt && k < tmp.size(); k ++)
        {
            string id = tmp[k].id;
            string name = tmp[k].name;
            int state = tmp[k].state;
            
            // 第一次申请的或者隔了p天之后可以申请
            if(mpt[id] == 0 || i - mpt[id] > p)
            {
                cout << name << ' ' << id << endl;
                mpt[id] = i;// 申请成功记录第几天
                j ++;
            }
        }
    }
    
    // 输出症状为1的上申请人
    for(int i = 0; i < p1.size(); i ++)
    {
        cout << p1[i].name << ' ' << p1[i].id << endl;
    }
    return 0;
}