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

 

posted @ 2020-07-11 12:10  Kanoon  阅读(243)  评论(0)    收藏  举报