PAT A1136~A1139

一、PAT A1136 A Delayed Palindrome

  1. 就是模拟啦,比较简单。参考代码如下。

#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

  1. 数据分类用了散列的思想,然后就是排序啦,参考代码如下。
#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

  1. 这道题的思路很简单,就是根据先序序列和中序序列递归建树,然后找后序遍历时的第一个结点。这样做能过,但是时间差一点就超限。应该还可以优化:在建树的同时就判断第一个结点是否已经可以找到,如果可以就不用继续建树了。未优化的参考代码如下。
#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

  1. 这道题很让人头疼。。。一开始建立了一个比较复杂的模型,就是用邻接表建立两个人之间的关系。先在 A 的邻接表中查找其同性朋友 C,然后在 C 的邻接表中查找 B 的同性朋友 D,然后判断 B 是否在 D 的邻接表中。然而最后一个测试点会超时,用什么奇淫技巧都过不去。
  2. 后来又是参考了这个萌妹子的博客,用邻接表建立两个人的关系,同时用 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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值