坑点:
应该就是题目要求的身份证号唯一
然后是相同的人同一天多次申请
然后是时间相同按照申请记录排序
需要注意的是,不要在同一天内看到满足要求的就直接发放口罩,有可能发完之后发现后面的人的时间更早
#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;
}