L2-034 口罩发放 (25 分)

身份证号必须是 (18) 位的数字数字数字,大概是眼瞎了。

  1. 同一个身份证号若在第 i 天申请成功,则接下来的 P 天不能再次申请。也就是说,若第 i 天申请成功,则等到第 i+P+1 天才能再次申请;
  2. 按照提交时间的先后顺序发放,直至全部记录处理完毕或 S个名额用完。如果提交时间相同,则按照在列表中出现的先后顺序决定。
  3. 最后额外输出有合法记录的、身体状况为 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;
}
原文地址:https://www.cnblogs.com/fxh0707/p/14683402.html