坑点:
应该就是题目要求的身份证号唯一
然后是相同的人同一天多次申请
然后是时间相同按照申请记录排序
需要注意的是,不要在同一天内看到满足要求的就直接发放口罩,有可能发完之后发现后面的人的时间更早
#include "bits/stdc++.h"
using namespace std;
struct line{
string name;
string num;
int si;
int time1, time2;
int day;
int n;
bool operator < (const line & a) const{
if(time1 != a.time1) return time1 < a.time1;
else if(time2 != a.time2)return time2 < a.time2;
else return n < a.n;
}
};
vector<line> v, w;
map<string, int> mp, mp1;
int main(){
int t, p;
cin>>t>>p;
int a, b;
string s;
line aa;
int k;
char e;
for(int i = 1; i <= t; i++){
cin>>a>>b; k = 0;
while(a--){
int flag = 0;
cin>>aa.name;
cin>>aa.num;
cin>>aa.si;
cin>>aa.time1;
cin>>e;
cin>>aa.time2;
aa.n = k ++;
string r = aa.num;
for(int j = 0; j < r.length(); j ++){
if(r[j] <'0' || r[j] > '9') {
flag = 1;
break;
}
}
if(r.length() != 18 || flag ==1) continue;
v.push_back(aa);
if( aa.si == 1 && !mp1[aa.num]){
mp1[aa.num] = 1;
w.push_back(aa);
}
}
stable_sort(v.begin(), v.end());
for(int j = 0; j <v.size() ;j ++){
if((!mp[v[j].num] || ( i - mp[v[j].num]) >=(p + 1)) && b > 0 ) {
mp[v[j].num] = i;
cout<<v[j].name<<" "<<v[j].num<<endl;
b--;
}
if(b == 0) break;
}
v.clear();
}
for(int i = 0; i < w.size(); i ++){
cout<<w[i].name<<" "<<w[i].num;
if(i != w.size() - 1) cout<<endl;
}
return 0;
}