思路
- 超级模拟
- 存好结构体之后,直接按照两条排序要求进行排序即可
#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;
}