模擬題,把准考證和分數記錄到vector裏面,查詢時遍歷vector。
注意:如果使用cout輸出結果會超時。
這道題注意的點:
cmp
的寫法,傳參儘量使用const引用
。unordered_map
的使用,效率比map
高。map
數組方式的初始化。- 容器中結構體的初始化的簡便方式。
range-based-for
的寫法。
c++代碼:
#include <bits/stdc++.h>
using namespace std;
struct Card {
string s;
int n;
};
struct Site {
string s;
int n;
};
bool cmp1(const Card &c1, const Card &c2) {
return c1.n == c2.n ? c1.s < c2.s : c1.n > c2.n;
}
bool cmp2(const Site &s1, const Site &s2) {
return s1.n == s2.n ? s1.s < s2.s : s1.n > s2.n;
}
void query(const vector<Card> &v, int n, const string &s) {
printf("%d %s\n", n, s.c_str());
if (n == 1) {
vector<Card> ans;
for (int i = 0; i < v.size(); ++i) {
if (v[i].s[0] == s[0]) {
ans.push_back(v[i]);
}
}
sort(ans.begin(), ans.end(), cmp1);
for (int i = 0; i < ans.size(); ++i) {
printf("%s %d\n", ans[i].s.c_str(), ans[i].n);
}
if (ans.size() == 0) {
printf("NA\n");
}
}
if (n == 2) {
int cnt = 0, sum = 0;
for (int i = 0; i < v.size(); ++i) {
if (v[i].s.substr(1, 3) == s) {
cnt++;
sum += v[i].n;
}
}
if (cnt) {
printf("%d %d\n", cnt, sum);
} else {
printf("NA\n");
}
}
if (n == 3) {
vector<Site> ans;
unordered_map<string, int> m;
for (int i = 0; i < v.size(); ++i) {
if (v[i].s.substr(4, 6) == s) {
m[v[i].s.substr(1, 3)]++;
}
}
for (auto it : m) {
ans.push_back({it.first, it.second});
}
sort(ans.begin(), ans.end(), cmp2);
for (int i = 0; i < ans.size(); ++i) {
printf("%s %d\n", ans[i].s.c_str(), ans[i].n);
}
if (ans.size() == 0) {
printf("NA\n");
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n, m;
cin >> n >> m;
vector<Card> v(n);
for (int i = 0; i < n; ++i) {
cin >> v[i].s >> v[i].n;
}
for (int i = 0; i < m; ++i) {
int num;
string s;
cin >> num >> s;
printf("Case %d: ", i + 1);
query(v, num, s);
}
return 0;
}