PAT1138 Postorder Traversal
根据前序和中序遍历确定二叉树,模板题,要求输出第一个后序遍历的节点。TIPS:利用map来映射后序遍历在中序遍历中的位置,否则复杂度过高导致TLE。
#include<iostream>
#include<unordered_map>
#define ac cin.tie(0);cin.sync_with_stdio(0);
using namespace std;
const int MAXN = 50010;
int in[MAXN], pre[MAXN];
int N;
unordered_map<int, int> M;
int main() {
ac
cin >> N;
for (int i = 0; i < N; i++)
cin >> pre[i];
for (int i = 0; i < N; i++) {
cin >> in[i];
//提高效率 否则TLE
M[in[i]] = i;
}
int le = 0, ri = N - 1, k = 0;
while (le < ri) {
int pos = M[pre[k]];
k++;
//有左孩子
if (pos > le)
ri = pos - 1;
//否则找右孩子
else
le = pos + 1;
}
cout << in[le];
return 0;
}
PAT 1053 Path of Equal Weight
DFS回溯模板题,注意Pat的数据较弱,如果样例很大,显然这个做法会TLE。题目要求权值从大到小,所以在每个节点存储的临界点中,按照权值从大到小dfs即可。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int MAXN = 110;
//邻接表存边
vector<int> G[MAXN], v;
vector<vector<int>> ans;
int we[MAXN];
int N, M, K;
bool cmp(int a, int b) {
return we[a] > we[b];
}
void dfs(int root, int &left) {
v.push_back(we[root]);
if (G[root].empty()) {
if (left == we[root]) {
ans.push_back(v);
}
} else {
left -= we[root];
for (int i:G[root])
dfs(i, left);
left += we[root];
}
v.pop_back();
}
int main() {
int a, len, tmp;
cin >> N >> M >> K;
for (int i = 0; i < N; i++)
cin >> we[i];
while (M--) {
cin >> a >> len;
for (int i = 0; i < len; i++) {
cin >> tmp;
G[a].push_back(tmp);
}
sort(G[a].begin(), G[a].end(), cmp);
}
dfs(0, K);
for (int i = 0; i < ans.size(); i++) {
if (i)
cout << endl;
for (int j = 0; j < ans[i].size(); j++) {
if (j)
cout << " ";
cout << ans[i][j];
}
}
return 0;
}
PAT 1094 The Largest Generation
树的层序遍历,模板题,注意不使用Queue来进行Level遍历的写法:
#include<iostream>
#define ac cin.tie(0);cin.sync_with_stdio(0);
using namespace std;
const int MAXN = 110;
bool G[MAXN][MAXN];
int arr[MAXN];
int N, M;
int main() {
int root, len, cl;
cin >> N >> M;
while (M--) {
cin >> root >> len;
while (len--) {
cin >> cl;
G[root][cl] = true;
}
}
int ans1 = 0, ans2 = -1;
int tt = 1, hh = 1, depth = 1;
arr[1] = 1;
while (tt <= hh) {
//size+1为当前层的个数,省去了使用Queue
int size = hh - tt + 1;
if (size > ans1) {
ans1 = size;
ans2 = depth;
}
for (int j = 0; j < size; j++) {
root = arr[tt++];
for (int i = 1; i <= N; i++)
if (G[root][i])
arr[++hh] = i;
}
++depth;
}
cout << ans1 << " " << ans2;
return 0;
}
PAT1024 Palindromic Number
模拟高精度,模板题。
#include<iostream>
#include<string>
using namespace std;
bool judge(const string &s) {
for (int i = 0; i < s.length() / 2; i++)
if (s[i] != s[s.length() - 1 - i])
return false;
return true;
}
void add(string &s) {
string tmp(s);
int carry = 0;
for (int i = s.length() - 1; i >= 0; i--) {
s[i] += tmp[s.length() - 1 - i] - '0' + carry;
carry = 0;
if (s[i] > '9') {
carry = 1;
s[i] -= 10;
}
}
//溢出的进位
if (carry)
s = "1" + s;
}
int main() {
string s;
int n, i = 0;
cin >> s >> n;
for (; i < n; i++) {
//判断是否为回文串
if (judge(s))
break;
//相加
add(s);
}
cout << s << endl << i;
return 0;
}
PAT1075 PAT Judge
一道很PAT的PAT题,很繁琐,要细心,通过全部测试点很不容易。
//PAT题目太烦了
#include<cstdio>
#include<algorithm>
using namespace std;
int fenshu[6];
struct node {
int score[6], cnt, total, id;
bool shown;
node() {
//编号
id = -1;
//完美样例个数
cnt = 0;
//总分
total = 0;
//该用户是否可以显示出来
shown = false;
for (int i = 0; i < 6; i++)
//-1代表没有提交过,0代表提交了但是编译出错为0分
score[i] = -1;
}
} arr[10010];
int N, K, M;
//按照题目要求排序
bool cmp(node &a, node &b) {
if (a.total != b.total)
return a.total > b.total;
else if (a.total == b.total && a.cnt != b.cnt)
return a.cnt > b.cnt;
else
return a.id < b.id;
}
int main() {
int a, b, c;
scanf("%d %d %d", &N, &K, &M);
for (int i = 1; i <= N; i++)
arr[i].id = i;
for (int i = 1; i <= K; i++)
scanf("%d", &fenshu[i]);
while (M--) {
scanf("%d %d %d", &a, &b, &c);
if (c == -1)
//-1代表提交了但是为0分,与我设的-1为没提交过不符,因此在此特判下
c = 0;
else
//只要有一个得分了,就可以显示出来
arr[a].shown = true;
arr[a].score[b] = max(arr[a].score[b], c);
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= K; j++)
if (arr[i].score[j] != -1) {
arr[i].total += arr[i].score[j];
if (arr[i].score[j] == fenshu[j])
//AC样例+1
++arr[i].cnt;
}
}
sort(arr + 1, arr + 1 + N, cmp);
int pos = 1, pos2 = 0;
for (int i = 1; i <= N; i++) {
//跳过没有资格显示的用户
if (!arr[i].shown)
continue;
else {
++pos2;
if (arr[i].total != arr[pos].total)
pos = pos2;
printf("%d %05d %d", pos, arr[i].id, arr[i].total);
for (int j = 1; j <= K; j++)
if (arr[i].score[j] != -1)
printf(" %d", arr[i].score[j]);
else
printf(" -");
if (i != N)
printf("\n");
}
}
return 0;
}