L2-034 口罩發放

YuKiCheng發表於2024-03-20

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

相關文章