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;
}
posted @ 2025-03-04 18:02  Yuhhhhh  阅读(102)  评论(0)    收藏  举报