身份证号必须是 (18) 位的数字,数字,数字,大概是眼瞎了。
- 同一个身份证号若在第 i 天申请成功,则接下来的 P 天不能再次申请。也就是说,若第 i 天申请成功,则等到第 i+P+1 天才能再次申请;
- 按照提交时间的先后顺序发放,直至全部记录处理完毕或 S个名额用完。如果提交时间相同,则按照在列表中出现的先后顺序决定。
- 最后额外输出有合法记录的、身体状况为 1 的申请人的姓名及身份证号。顺序按照申请记录中出现的顺序确定,同一个人只需要输出一次
注意2和3给定的输出顺序。
struct Node
{
string name;
string id;
bool state;
string tim;
int idx;
int last;
bool operator<(const Node &W) const
{
if(tim != W.tim) return tim < W.tim;
return idx < W.idx;
}
};
unordered_map<string,Node> mp;
unordered_set<string> S;
int n,m;
bool check(string id)
{
if(id.size() != 18) return false;
for(int i=0;i<id.size();i++)
if(!isdigit(id[i]))
return false;
return true;
}
int main()
{
cin>>n>>m;
vector<Node> ans;
for(int i=1;i<=n;i++)
{
int k,s;
cin>>k>>s;
vector<Node> a(k);
vector<Node> res;
for(int j=0;j<k;j++)
{
cin>>a[j].name>>a[j].id>>a[j].state>>a[j].tim;
a[j].idx=j;
if(check(a[j].id) && a[j].state) ans.pb(a[j]);
}
sort(a.begin(),a.end());
for(int j=0;j<k;j++)
{
string id=a[j].id,name=a[j].name,tim=a[j].tim;
bool state=a[j].state;
if(s == 0) break;
if(check(id))
{
if(mp[id].last == 0 || i-mp[id].last > m)
{
mp[id].last=i;
s--;
res.pb(a[j]);
}
}
}
for(auto t:res)
cout<<t.name<<' '<<t.id<<endl;
}
for(auto t:ans)
{
if(S.count(t.id)) continue;
cout<<t.name<<' '<<t.id<<endl;
S.insert(t.id);
}
//system("pause");
return 0;
}