2020-PTA总决赛-L2-2 口罩发放(包含测试点分析)
坑:
1.身份证号必须严格的18位数字,必须是纯数字!
2.同一天,一个人多次申请,但是以最早的为准,不可以重复获得资格!
3.不要把前一天剩下的名额加到后一天算!
4.有可能发放名额为0,但我没踩,正常写即使是0应该也不会影响...
5.当天提交时间如果相同,按出现的先后顺序
6.输出有症状的人时要去重,而且一个人两次提交,有可能第一次没症状,第二次有症状
测试点:
4,5测试点----坑1,坑5
5,6测试点----坑2
5测试点-------坑6
0,3测试点----坑1的18位
1,6测试点----坑3或者其它逻辑错误
AcCode:
#include<bits/stdc++.h>
using namespace std;
struct people{
string name;
string id;
int health;
int cheak; //最近一次申请成功的日期
int time; //最近一次申请时间(在当天)
int pid; //坑---出现顺序
};
bool Cmp(const people &a, const people &b){
if(a.time != b.time)
return a.time < b.time;
else return a.pid < b.pid;
}
map<string, bool> s;
vector<people> res;
map<string, people> m; //id : people;
int main(){
int D, P;
regex pattern("^\\d+$"); //正则表达式匹配纯数字
cin >> D >> P;
for(int i = 1; i <= D; i++){
vector<people> path; //存放满足要求的(忽略名额)居民
int T, S, pid = 0; //pid是当天的列表顺序编号
cin >> T >> S;
while(T--){
string nm, id;
int st, hh, mm;
cin >> nm >> id >> st;
scanf("%d:%d", &hh, &mm);
if(id.length() != 18 || !regex_match(id, pattern)) continue;
if(st == 1){
if(s.find(id) == s.end()){
s[id] = true;
res.push_back({nm, id, st, i, hh * 60 + mm, pid});
}
}
if(m.find(id) == m.end()){
path.push_back({nm, id, st, i, hh * 60 + mm, pid++});
}else{
if(i - m[id].cheak > P){
path.push_back({nm, id, st, i, hh * 60 + mm, pid++});
}
}
}
int cnt = 0;
sort(path.begin(), path.end(), Cmp);
map<string, bool> mp; //用来去重当天多次提交申请的人
for(int j = 0; cnt < S && j < path.size(); j++){
if(mp.find(path[j].id) == mp.end()){
m[path[j].id] = path[j];
mp[path[j].id] = true;
cout << path[j].name << " " << path[j].id << endl;
cnt++;
}
}
}
for(auto i = res.begin(); i != res.end(); i++){
cout << (*i).name << " " << (*i).id << endl;
}
return 0;
}