PAT(乙级)2019年冬季考试
比赛链接:https://pintia.cn/market/item/1203557339918098432
7-1 2019数列
题解
简单的递推。
代码
#include <bits/stdc++.h> using namespace std; int main() { int f[1005] = {2, 0, 1, 9}; for (int i = 4; i < 1005; i++) f[i] = (f[i - 1] + f[i - 2] + f[i - 3] + f[i - 4]) % 10; int n; cin >> n; for (int i = 0; i < n; i++) cout << f[i]; }
7-2 老鼠爱大米
题解
简单的模拟。
代码
#include <bits/stdc++.h> using namespace std; int main() { int n, m; cin >> n >> m; vector<int> res; for (int i = 0; i < n; i++) { int a[m] = {}; for (int j = 0; j < m; j++) cin >> a[j]; res.push_back(*max_element(a, a + m)); } for (int i = 0; i < res.size(); i++) cout << res[i] << " \n"[i == res.size() - 1]; cout << *max_element(res.begin(), res.end()) << "\n"; }
7-3 String复读机
题解
简单的模拟。
Tips
for (char c : "String") 与 for (char c : string("String")) 是不同的,前者会多遍历一个结束符。
代码
#include <bits/stdc++.h> using namespace std; int main() { string s; cin >> s; map<char, int> cnt; for (char c : s) ++cnt[c]; while (true) { int fail = 0; for (char c : string("String")) { if (--cnt[c] >= 0) cout << c; else ++fail; } if (fail == 6) break; } }
7-4 擅长C
题解
原题 hdu 2072,总结一下坑点:
- 单词间可能以空格分割,所以最后一行要整行读入
- 整行读入前要用 getchar() 吃掉上一行的 '\n' ,不过可以全用 getline()
- 可能以单词结尾,所以要再推入一个分隔符
- 可能以分隔符开头或有连续分隔符,所以要截取单词前要判断单词头部的合法性
代码
#include <bits/stdc++.h> using namespace std; string ch[26][7]; int main() { for (int i = 0; i < 26; i++) for (int j = 0; j < 7; j++) cin >> ch[i][j]; getchar(); string s; getline(cin, s); s.push_back('#'); vector<string> word; for (int i = 0, pre = 0; i < s.size(); i++) { if (!isupper(s[i])) { if (isupper(s[pre])) word.push_back(s.substr(pre, i - pre)); pre = i + 1; } } for (int i = 0; i < word.size(); i++) { for (int j = 0; j < 7; j++) for (int k = 0; k < word[i].size(); k++) cout << ch[word[i][k] - 'A'][j] << " \n"[k == word[i].size() - 1]; if (i < word.size() - 1) cout << "\n"; } }
7-5 区块反转
题解
与秋季的链表题相似(事实上最后输出的代码就是直接复制粘贴的),将链式存储结构转为顺序存储结构即可。
代码
#include <bits/stdc++.h> using namespace std; map<int, int> Data, Next; int main() { int head, n, k; cin >> head >> n >> k; for (int i = 0; i < n; i++) { int a, d, n; cin >> a >> d >> n; Data[a] = d; Next[a] = n; } vector<int> v; for (int i = head; i != -1; i = Next[i]) v.push_back(i); int N = (v.size() + k - 1) / k; vector<int> res[N]; for (int i = 0; i < v.size(); i++) { res[i / k].push_back(v[i]); } v.clear(); for (int i = N - 1; i >= 0; i--) for (int j = 0; j < res[i].size(); j++) { v.push_back(res[i][j]); } for (int i = 0; i < v.size(); i++) { cout << setw(5) << setfill('0') << v[i] << ' '; cout << Data[v[i]] << ' '; if (i + 1 < v.size()) cout << setw(5) << setfill('0') << v[i + 1] << "\n"; else cout << -1 << "\n"; } }

浙公网安备 33010602011771号