一、PAT A1136 A Delayed Palindrome
-
就是模拟啦,比较简单。参考代码如下。
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
void add(string &a, string &b) {
int len = a.size();
for (int i = len - 1; i >= 0; i--) {
a[i] += b[i] - '0';
if (a[i] > '9') {
a[i] -= 10;
if (i == 0) a.insert(a.begin(), '1');
else a[i - 1]++;
}
}
}
bool judge(string s) {
for (int i = 0; i < s.size() / 2; i++)
if (s[i] != s[s.size() - i - 1])
return false;
return true;
}
int main() {
string s;
int cnt = 0;
cin >> s;
while (!judge(s) && cnt < 10) {
string t = s;
reverse(t.begin(), t.end());
cout << s << " + " << t << " = ";
add(s, t);
cnt++;
cout << s << endl;
}
if (cnt == 10)
cout << "Not found in 10 iterations." << endl;
else
cout << s << " is a palindromic number." << endl;
return 0;
}
二、PAT A1137 Final Grading
- 数据分类用了散列的思想,然后就是排序啦,参考代码如下。
#include<cstdio>
#include<unordered_map>
#include<string>
#include<vector>
#include<math.h>
#include<algorithm>
using namespace std;
struct node {
string name;
int Gm = -1, Gf = -1, Gp = -1;
float G;
};
bool cmp(node &n1, node &n2) {
if ((int)round(n1.G) != (int)round(n2.G))
return (int)round(n1.G) > (int)round(n2.G);
else return n1.name < n2.name;
}
unordered_map <string, node> mp;
vector <node> v;
int main() {
int p, m, n, score;
char name[30];
scanf("%d%d%d", &p, &m, &n);
for (int i = 0; i < p; i++) {
scanf("%s%d", name, &score);
mp[string(name)].name = name;
mp[string(name)].Gp = score;
}
for (int i = 0; i < m; i++) {
scanf("%s%d", name, &score);
mp[string(name)].name = name;
mp[string(name)].Gm = score;
}
for (int i = 0; i < n; i++) {
scanf("%s%d", name, &score);
mp[string(name)].name = name;
mp[string(name)].Gf = score;
}
for (auto it : mp) {
if (it.second.Gm > it.second.Gf)
it.second.G = 0.4 * it.second.Gm + 0.6 * it.second.Gf;
else it.second.G = it.second.Gf;
if (it.second.Gp >= 200 && (int)round(it.second.G) >= 60)
v.push_back(it.second);
}
sort(v.begin(), v.end(), cmp);
for (auto it : v)
printf("%s %d %d %d %d\n", &it.name[0], it.Gp, it.Gm, it.Gf, (int)round(it.G));
return 0;
}
三、PAT A1138 Postorder Traversal
- 这道题的思路很简单,就是根据先序序列和中序序列递归建树,然后找后序遍历时的第一个结点。这样做能过,但是时间差一点就超限。应该还可以优化:在建树的同时就判断第一个结点是否已经可以找到,如果可以就不用继续建树了。未优化的参考代码如下。
#include<cstdio>
using namespace std;
const int maxn = 50005;
struct node {
int v;
node* lchild = NULL;
node* rchild = NULL;
};
int pre[maxn], in[maxn];
node* build(int preL, int preR, int inL, int inR) {
if (preL > preR) return NULL;
node* temp = new node;
temp->v = pre[preL];
int k;
for (k = inL; k <= inR; k++)
if (in[k] == pre[preL])
break;
int num = k - inL;
temp->lchild = build(preL + 1, preL + num, inL, k - 1);
temp->rchild = build(preL + num + 1, preR, k + 1, inR);
return temp;
}
node* find_node(node* root) {
if (root->lchild)
return find_node(root->lchild);
else if (root->rchild)
return find_node(root->rchild);
else return root;
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &pre[i]);
for (int i = 0; i < n; i++)
scanf("%d", &in[i]);
node* tree = build(0, n - 1, 0, n - 1);
printf("%d\n", find_node(tree)->v);
return 0;
}
四、PAT A1139 First Contact
- 这道题很让人头疼。。。一开始建立了一个比较复杂的模型,就是用邻接表建立两个人之间的关系。先在 A 的邻接表中查找其同性朋友 C,然后在 C 的邻接表中查找 B 的同性朋友 D,然后判断 B 是否在 D 的邻接表中。然而最后一个测试点会超时,用什么奇淫技巧都过不去。
- 后来又是参考了这个萌妹子的博客,用邻接表建立两个人的关系,同时用 map 映射两个人是否为朋友。这样只需遍历 A 和 B 的朋友圈,找到圈中互为朋友且分别与 A 同性,与 B 同性的人即可。参考代码如下(差一点点就时间超限)。
#include<cstdio>
#include<iostream>
#include<string>
#include<unordered_map>
#include<vector>
#include<algorithm>
using namespace std;
struct node { string p1, p2; };
bool cmp(node &n1, node &n2) {
if (n1.p1 == n2.p1) return n1.p2 < n2.p2;
else return n1.p1 < n2.p1;
}
bool same_sex(string &s1, string &s2) {
if (s1.size() == s2.size()) return true;
else return false;
}
unordered_map <string, vector<string>> mp;
unordered_map <string, bool> relation;
int main() {
int n, m, k;
scanf("%d%d", &n, &m);
string p1, p2;
while (m--) {
cin >> p1 >> p2;
mp[p1].push_back(p2);
mp[p2].push_back(p1);
relation[p1 + p2] = true;
relation[p2 + p1] = true;
}
scanf("%d", &k);
while (k--) {
vector <node> ans;
cin >> p1 >> p2;
for (auto it1 : mp[p1])
for (auto it2 : mp[p2]) {
if (it1 == p2 || it2 == p1) continue;
if (same_sex(it1, p1) && same_sex(it2, p2) && relation[it1 + it2]) {
string s1, s2;
s1 = it1, s2 = it2;
if (s1.size() == 5) s1.erase(s1.begin());
if (s2.size() == 5) s2.erase(s2.begin());
ans.push_back(node{ s1, s2 });
}
}
sort(ans.begin(), ans.end(), cmp);
printf("%d\n", ans.size());
for (auto it : ans)
printf("%s %s\n", &it.p1[0], &it.p2[0]);
}
return 0;
}