题干:1153 Decode Registration Card of PAT (25 分)
- 题解:我自己的题解拿了19分,最后两个点超时,就算用了无序映射也没有解决。。。但对我这个水平的人来说,已经很知足了。
- 这题可以说是非常经典的一道题,这题用到了很多C++ string的很多操作,这点在考前必须熟练,还有对map的使用,如果这题会做得来,如果再熟悉一部分的数学操作,和对数组或者说vector或者数组的遍历在解决问题中的几种应用有一定的认识的话,解决20,25的题应该是比较轻松地
- 这题我做了快1个小时,也比较符合考试要求的时间,因为我并没有准备90分这个样子。。。50/60已经很知足了。。。这次主要是一个通过PAT的备考过程也准备了考研计算机的专业课。。。后面不太准备花时间,再做算法题就是等考研初试以后,面试的时候再到目标院校去考了。。。PAT算作一个学习的过程吧
- 仔细想想自己也是练了不少题才到今天的这个程度的,才又心情做完题目去写博客。。。建议大家就刷PAT的题库就好了,不要找其他的题库,意义不是很大,各个的OJ上面的题目对考甲级和乙级的太难了,有不少的超纲题,PAT顶级才有考,但是如果时间非常充裕可以考虑LeetCode,这个平台上面的难度和pat甲级差不多,而且甲级的后面两题,涉及到图,树,堆这种数据结构的应用,leetcode上面有不少一致的题型
- 编码和调试上面,我墙裂推荐visual studio,因为是疫情是远程考试,请珍惜这个能够用重型IDE的机会,你如果没试过,根本不知道visual studio用来调试到底有多爽,但是需要注意的是,visual studio在开始之前需要加一些配置上面的细节,你如果遇到了可以去百度,但是并不复杂,主要的就是两样(一个是不安全函数,scanf和freopen,还有通用头文件,vs本身没有,需要自己建一个,细节问百度)如果做不来跟我留言,这里顺带一提,freopen和前面的ifndef配合可以显著提高调试程序的效率,相信我,使用的方法你可以参考百度上面和我代码里面的用法,这里提醒你注意一个,这个in.txt需要放在源代码文件的同一目录下。。。而不是可执行文件
-
// A1153.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include<unordered_map> #include <bits/stdc++.h> using namespace std; #pragma warning(disable:4996) struct elem { string a; int b; }; struct dot { string c; int d; }; vector<elem> an; int n, m, i, t2, t3; string t1, t4; bool cmp1(elem x,elem y) { if (x.b != y.b) { return x.b > y.b; } else { return x.a < y.a; } } bool cmp2(dot x, dot y) { if (x.d != y.d) { return x.d > y.d; } else { return x.c < y.c; } } void f1(int time,string x) { int j; cout << "Case " << time << ": 1 " << x<<endl; char c = x[0]; vector<elem> bn1; for (j = 0; j < n; j++) { if ((an[j].a)[0] == c) { bn1.push_back(an[j]); } } sort(bn1.begin(), bn1.end(), cmp1); int len = bn1.size(); if (len == 0) { cout << "NA\n"; } else { for (j = 0; j < len; j++) { cout << bn1[j].a << " " << bn1[j].b << endl; } } } void f2(int time, string param) { cout << "Case " << time << ": 2 " << param << endl; int k; int score = 0,count=0; for (k = 0; k < n; k++) { if ((an[k].a).substr(1, 3) == param) { count++; score += an[k].b; } } if (count==0) { cout << "NA\n"; } else { cout << count << " " << score << endl; } } void f3(int time, string param) { cout << "Case " << time << ": 3 " << param << endl; unordered_map<string, int> cn; int k; for (k = 0; k < n; k++) { if ((an[k].a).substr(4, 6) == param) { cn[(an[k].a).substr(1, 3)]++; } } vector<dot> xn; if (cn.size() == 0) { cout << "NA\n"; } else { for (auto it : cn) { xn.push_back({ it.first, it.second }); } sort(xn.begin(), xn.end(),cmp2); for (auto it : xn) { cout << it.c << " " << it.d<<endl; } } } int main() { ios::sync_with_stdio(false); #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); #endif // !ONLINE_JUDGE cin >> n >> m; for (i = 0; i < n; i++) { cin >> t1 >> t2; an.push_back({ t1,t2 }); } for ( i = 0; i < m; i++) { cin >> t3 >> t4; switch (t3) { case 1: f1(i+1,t4); break; case 2: f2(i + 1, t4); break; case 3: f3(i + 1, t4); break; default: break; } } return 0; }
别人的满分代码,需要的朋友可以参考。。。但是我这个博客主要是写给和我水平接近的人看的。。。。我的代码看起来应该会更好理解和吸收,虽然不是满分。。。
-
#include <iostream> #include <vector> #include <unordered_map> #include <algorithm> using namespace std; struct node { string t; int value; }; bool cmp(const node &a, const node &b) { return a.value != b.value ? a.value > b.value : a.t < b.t; } int main() { int n, k, num; string s; cin >> n >> k; vector<node> v(n); for (int i = 0; i < n; i++) cin >> v[i].t >> v[i].value; for (int i = 1; i <= k; i++) { cin >> num >> s; printf("Case %d: %d %s\n", i, num, s.c_str()); vector<node> ans; int cnt = 0, sum = 0; if (num == 1) { for (int j = 0; j < n; j++) if (v[j].t[0] == s[0]) ans.push_back(v[j]); } else if (num == 2) { for (int j = 0; j < n; j++) { if (v[j].t.substr(1, 3) == s) { cnt++; sum += v[j].value; } } if (cnt != 0) printf("%d %d\n", cnt, sum); } else if (num == 3) { unordered_map<string, int> m; for (int j = 0; j < n; j++) if (v[j].t.substr(4, 6) == s) m[v[j].t.substr(1, 3)]++; for (auto it : m) ans.push_back({it.first, it.second}); } sort(ans.begin(), ans.end(),cmp); for (int j = 0; j < ans.size(); j++) printf("%s %d\n", ans[j].t.c_str(), ans[j].value); if (((num == 1 || num == 3) && ans.size() == 0) || (num == 2 && cnt == 0)) printf("NA\n"); } return 0; }