破防了,我自己写的只能得5分,测试点0都过不去,并且至今没有找到错误的原因。
等我找到了再回来。
然后看别人的。
#include <bits/stdc++.h>
using namespace std;
struct node {
string name;
string tno;
int state;
int time;
int pos;
};
map<string, int> mp;//领取资格
vector<node> v;
vector<pair<string, string>> peo;
set<pair<string, string>> s;
bool check(string s) {
if (s.size() != 18) return false;
for (int i = 0; i < s.size(); i++) {
if (!isdigit(s[i])) return false;
}
return true;
}
bool cmp(node n1, node n2) {
if (n1.time != n2.time) return n1.time < n2.time;
return n1.pos < n2.pos;
}
int main() {
int d, p;
cin >> d >> p;
for (int i = 1; i <= d; i++) {//第i天
int t, s;
cin >> t >> s;//申请数量 口罩数量
v.clear();
int hh, mm;
for (int j = 1; j <= t; j++) {
node node;
cin >> node.name >> node.tno >> node.state >> hh;
cin.get();
cin >>mm;
node.time = 60 * hh + mm;
node.pos = j;
if (check(node.tno)) {//身份证号符合要求
string str = node.tno;
if (!mp[str] || mp[str] + p < i) {
v.push_back(node);
}
if (node.state) {
peo.push_back({ node.name,node.tno });
}
}
}
sort(v.begin(), v.end(), cmp);
//输出当天领到口罩的人
for (int j = 0; j < v.size(); j++) {
if (s == 0) break;
string tno = v[j].tno;
if (!mp[tno] || mp[tno] + p < i) {
printf("%s %s\n", v[j].name.c_str(), v[j].tno.c_str());
mp[tno] = i;
s--;
}
}
}
for (int i = 0; i < peo.size(); i++) {
if (!s.count(peo[i])) {
printf("%s %s\n", peo[i].first.c_str(), peo[i].second.c_str());
s.insert(peo[i]);
}
}
return 0;
}
博客参考: https://blog.csdn.net/qq_45901251/article/details/124317933
标签:node,口罩,return,int,peo,L2,str,tno,034 From: https://www.cnblogs.com/chengyiyuki/p/18085873