破防了,我自己寫的只能得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