PAT甲级官网 刷题(1)

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;
}

猜你喜欢

转载自blog.csdn.net/Raymond_YP/article/details/109967860