PAT甲级 2020冬季赛总结

PAT甲级 2020冬季赛总结

刚刚结束了PAT甲级冬季赛。最后以54分的成绩“惨淡收尾”。。其中感想颇多,因此来写个博客记录一下。

由于本次考试和秋季考试一样,都是线上举办的。所以需要开启摄像头,双机位进行监考。虽然我事先已经反复阅读过这个考场准则,已经监考规则,顺便在家里面反复模拟过考试环境,但最后还是没想到发生了意外

意外

大概开始考试的25分钟后,突然我发现自己电脑的网络断了(因为是用手机开着热点在考试的。家里WIFI信号不稳定)。然后这个时候我没有办法,只能拿起手机看看到底是怎么回事。然后发现上面显示:”电池温度过高,已经自动关闭热点和移动数据“。。。我当时内心1w个草泥马奔腾而过:怎么这种时候来了这出戏?然后赶紧把窗帘拉上,把手机自动亮度关闭,屏幕调到最暗。再打开热点,然后发现这手机就跟我作对一样,又自动帮我把它关了。。反复按了十来遍都没用,逼得我重启。这样过了5分钟,然后重新拍照,上传,终于又过了2分钟,再次回到考场,结果受到了监考老师的一顿骂。她的意思就是说只要退出超过5分钟就算作弊。我反复解释我到底遇到了什么情况,又跟她苦口婆心的解释了3分钟左右,她最终同意我继续考试。。到这里我的心态已经是崩了一大半了,眼看第一题才刚刚做完,时间已经过去了40分钟。。。

考试过程

第一题没什么好说的,只要把斐波那契数列暴力打表打出来,然后从这个数列里面找就行了(长度控制在负溢出)。
然后到了第二题。这个题一开始以为是KMP,后来仔细看了一下发现不是。它这里区分了子序列和字串的概念。所以需要重新写过。我这里使用了KMP的思想,最后debug了一会,也过。到这里已经用时超过了一小时。。。
好了,接下来到了最坑人的第三题。这里我前后足足花了一个小时还要多的时间。首先第一个把我坑掉的地方:要数空格!!!由于之前自己训练的时候,大部分的字符串题目都是直接无脑cin,从来没有关注过要把空格也存进去的情况。直到这里。。。当时彻底慌了,猛然间想起有一个getline的C++函数,可以按行读取。结果一跑,一直报运行时错误异常。我看自己代码写的没有任何的问题,但怎么会产生这样的错误?开始打断点调试,哦,原来是getline把换行符读进来了,而我用到的字符串转int的函数stoi把换行符作为参数传进来以后,就直接爆错。mmp!就这个很简单的东西我居然忘记了!!!(由于之前一直是搞java的,java的nextLine()没有这个问题)把这个改了之后,终于不报错了,也通过了测试用例。此时遇到了第二个坑点:15分的数据点过不了!!!这个时候我想起了前辈说过的一句话:前三题必有一道坑b题。估计是某个特判情况我没有想到,所以选择性放弃这道题,专攻后面30分。
知道了getchar这个技巧后,这道题总算是没有爆异常了。但是得到的结果总有问题。我的思路是用DFS暴力解决掉(因为看到数据规模还是比较小的,想着应该可以暴力)。然后又得不到正确的答案,debug搞了20多分钟,还是没解决。这个时候突然心态崩了,即使考试就只剩30分钟,直接把试卷交了。。。最后拿了54分。。。

垃圾代码

以下是本菜鸡的垃圾代码,给各位带佬当个笑话看吧。

  • T1 7-1
    • 题意:
      给出一个数,让你求出最靠近它的斐波那契数。
#include<iostream>
#include <vector>
#include <cmath>
#define ll long long
using namespace std;
const int MAX_N = 10010;
int fib[MAX_N];
int s;
void fix_fib(){
    fib[0] = fib[1] =  1;
    for(int i = 2;;i++){
        int tmp  = fib[i-1] + fib[i-2];
        if(tmp < 0) {s = i; break; }
        fib[i] = tmp;
    }
}

int main(){
    int n;
    cin>>n;
    int min_delta= 0x3f3f3f3f;
    int ans;
    fix_fib();
    for(int i = 1;i<s;i++){
        if(abs(fib[i]-n) < min_delta){
            ans = fib[i];
            min_delta = abs(fib[i] - n);
        }
    }
    cout<<ans<<endl;
    return 0;
}
  • T2 7-2
    • 题意:
      上文已经讲了
#include <bits/stdc++.h>
using namespace std;
string str,s;
int main(){
    cin>>str>>s;
    int p1 = 0,p2;
    int min_len = 1000000;
    string ans;
    while (p1 < str.length()){
        p2 = 0;
        while (str[p1] != s[p2] && p1 < str.length()){
            p1++;
        }
        for(int i = p1;i<str.length();i++){
            if(str[i] == s[p2]){
                p2++;
            }
            if(p2 == s.length()){//如果发现子序列已经匹配完毕
                if((i-p1+1) < min_len){
                    min_len = i - p1 + 1;
                    ans = str.substr(p1,i-p1+1);
                }
                break;
            }
        }
        p1++;
    }
    cout<<ans<<endl;
    return 0;
}
  • T3 7-3
    17分的数据点没通过,就通过了7分的。。。。
#include <bits/stdc++.h>
using namespace  std;
const int MAX_N = 10010;
int n,k;
int parent[MAX_N],level[MAX_N];
//计算层数
int cnt_level(const string &str){
    int ans = 0;
    while (str[ans] == ' '){
        ans++;
    }
    return ans;
}
int main(){
    memset(parent,-1,sizeof (parent));//先全部都填充为-1
    memset(level,-1,sizeof (level));
    string root;
    cin>>n;
    cin>>root;
    parent[stoi(root)] = stoi(root);level[stoi(root)] = stoi(root);
    getchar();
    int preLv =  0;
    for(int i = 1;i<n;i++){
        string str;
        getline(cin,str);
        int lv = cnt_level(str);
        int str_val = stoi(str);
        if(lv != preLv){
            parent[str_val] = level[lv-1];
            level[lv] = str_val;
            preLv = lv;
        }
        else {
            parent[str_val] = level[lv-1];
        }
    }
    cin>>k;
    while (k--){
        int q;cin>>q;
        if(parent[q] == -1){
            printf("Error: %04d is not found.\n",q);
        }
        else{
            stack<int> ans;
            while (parent[q] != q){
                ans.push(q);
                q = parent[q];
            }
            printf("0000");
            while (ans.size()){
                printf("->%04d",ans.top());
                ans.pop();
            }
            printf("\n");
        }
    }
    return 0;
}
  • T4 7-4
#include<vector>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int MAX_N = 110, MAX_M = 110;
vector<vector<int> > solution[MAX_N];
vector<int > tempAns[MAX_M], ans[MAX_M];
int r[MAX_N], p[MAX_N], n, m, k;
bool valid[MAX_N] = { false };//同于判断反应原料是否还可以使用
bool way[MAX_M][MAX_N] = { false };
bool has_ans = false;
void deal(const string& str) {
    vector<int> tmp;
    for (int i = 0; i < str.length(); i++) {
        if (str[i] >= '0' && str[i] <= '9') {
            tmp.push_back(stoi(str.substr(i, 2)));
            i++;
        }
        else if (str[i] == '-') break;
    }
    solution[stoi(str.substr(str.length() - 2, 2))].push_back(tmp);
}
bool cmp(const vector<int>& v1, const vector<int>& v2) {
    return v1 < v2;
}
bool test(const vector<int>& v) {
    for (int elem : v) {
        if (valid[elem] == false) return false;
    }
    return true;
}
void dfs(int index) {
    if (index > m || has_ans) return;
    if (index == m) {
        has_ans = true;
        for (int i = 0; i < m; i++) {
            ans[p[i]] = tempAns[p[i]];
        }
        return;
    }
    for (int i = 0; i < solution[p[index]].size(); i++) {
        vector<int> w = solution[p[index]][i];
        if (test(w)) {
            for (int elem : w) {
                valid[elem] = false;
            }
            tempAns[p[index]] = w;
            dfs(index + 1);
            for (int elem : w) {
                valid[elem] = false;
            }
            tempAns[p[index]].clear();
        }
    }
}

int main() {
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> r[i];
        valid[r[i]] = true;
    }
    cin >> m;
    for (int i = 0; i < m; i++) {
        cin >> p[i];
        if (valid[p[i]]) {
            vector<int> tmp(1);
            tmp[0] = p[i];
            solution[p[i]].push_back(tmp);
        }
    }
    cin >> k;
    getchar();
    while (k--) {
        string e;
        getline(cin, e);
        deal(e);
    }
    for (int i = 0; i < m; i++) {
        sort(solution[p[i]].begin(), solution[p[i]].end(), cmp);
    }
    dfs(0);
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < ans[p[i]].size(); j++) {
            printf("%02d", ans[p[i]][j]);
            if (j != ans[p[i]].size() - 1) {
                printf(" + ");
            }
            else printf(" -> ");
        }
        printf("%02d\n", p[i]);
    }
    return 0;
}

2分代码。。。纯粹来骗分的。

总结

其实本质上还是自己心态太差,以及水平太菜。认识的ACM大佬这个考试50分钟的时候就满分交卷走人了。。之前自己做模拟题的时候分数都是在85-90分左右,然后这次突然爆掉,也在意料之中。又想起之前高中老师说的一句话:所有的考砸都是正常发挥。考砸只是你自欺欺人的一个借口。今天这个考试,也不能说是自己运气太差,最主要的还是准备不充分,像字符串这一块因为前几年没怎么考,所以就把它忽视了,直到今天被这个么一个getchar()搞到自闭。以及不能依赖于题库,现在PAT甲级考试考的内容更灵活了,少了那种直接打个模板就能走人的题目,所以相应地,不能只是为了考试而准备考试,最根本的还是要把时间花在提升自己的算法水平和细节处理能力上(其实很多算法的都是能想到的,就是自己过于粗线条,比如把数组下标当成值来做,缺乏训练)。
自己学习天赋真的也就一般般。大一大二的时候,别人能够一天学完的东西我可能要花个三四天,可能自己确实不太适合搞计算机吧。。
最后,唉,就到这里吧。

– 来自一个不学无术的大三菜狗的总结

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值