2020冬季 PAT 甲级记录
第一次参加PAT,本来九月份报名的时候是打算到十二月份的时候把乙级的题库刷完,然后甲级的题库刷一半,结果因为各种各样的事情(主要是懒又没坚持0.0)这次直到考前乙级才刷完三分之二,甲级一题都没刷就来考试了,而且考前才得知原来我报名的考点是线上考点要自己准备环境,一看考试须知,周围2.5米内不得有人,考试中途不能上厕所,妈蛋我是六人寝啊,2.5米不得有人我要把我舍友都扔出去吗- -,我最喜欢做题喝水了,之前打一场比赛至少要去个三次厕所,感觉自己被针对了0.0然后焦头烂额准备环境(把自己的电脑和座位拿几件外套围起来,通知舍友不要发出声音。。)再加上最近沉迷刀剑真是想不白给都难,不废话了,上题目
1、斐波那契数列(模拟)
签到题,感觉是送分的
#include<bits/stdc++.h>
using namespace std;
long long t, s1 = 0, s2 = 1, n, ans1, ans2, ans;
void fib(int a, int b){
ans = s1 + s2;
if(ans >= n){
ans1 = ans;
return;
}
else{
s1 = s2;
s2 = ans;
ans2 = ans;
fib(s1, s2);
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
fib(s1, s2);
if(abs(n - ans1) < abs(n - ans2)) cout << ans1;
else cout << ans2;
return 0;
}
2、substring(字符串匹配)
这题以前训练的时候做过类似的,不过当时就没好好做,然后也一知半解,那个时候一起练习的大神同学说什么滑动窗口什么的,我现在也不太会就是了,当时考试的时候开了三个记录的数组,然后之间的逻辑关系就贼绕,特别复杂,其实暴力就能做出来了,当时环境也不太好发挥很差,改了很久没改好,这代码是第二天改的,不知道能不能过
#include<bits/stdc++.h>
using namespace std;
const int o = 1e4 + 5;
int c1, c2, f1[o], f2[o], flag, sta;
//f1记录所有子串中的字符在字符串中出现的下标
//f2记录子串中每个字符出现的第一次在f1中的下标
int main(){
string s1, s2;
cin >> s1 >> s2;
for(int i = 0; i < s1.size(); i++){
if(s1[i] == s2[0]){
sta = i;//第一个出现的位置,为后面n*m稍微优化一下
break;
}
}
for(int i = 0; i < s2.size(); i++){
flag = 0;
for(int j = sta;j < s1.size(); j++){
if(s1[j] == s2[i]){
if(flag == 0){
flag = 1;
f2[c2++] = c1;
}
f1[c1++] = j;
}
}
}
int cc1 = 1, minn = 1e8, flag1, ans, p, flag2;
if(c2 > 1){
for(int i = 0; i < f2[1]; i++){
flag1 = 0, cc1 = 1;
for(int j = f2[cc1]; j < o; j++){
if(flag2 == 1){
flag2 = 0;
j = f2[cc1];
}
if(f1[i] < f1[j]){//如果这个字符出现的下标在前一个字符之后,那就成功,每次只要记录后一个=种字符的第一个就行了
flag2 = 1;
cc1++;
if(cc1 == c2){//完成子串,那么记录长度和位置,ans为长度,p为在字符串中的下标
ans = f1[j] - f1[i] + 1;
if(ans < minn){
minn = ans;
p = f1[i];
}
flag1 = 1;
break;
}
}
}
if(flag1 == 1) continue;
}
string pp;
pp = s1.substr(p, minn);
cout << pp;
}
else cout << s2;
return 0;
}
/*
atpaaabpabttpcat
pat
*/
3、文件树(模拟)
这题看着挺复杂的,开了vector存路径,结果写完才发现根本没有vector的出场,真是离谱,然后细节修改修改提交,格式错误,懵逼,给的样例error在最后一行,所以我的error那一行没加换行, 结果我debug了半个小时才发现这个问题,服了,又特别想上厕所(我没喝水啊!)
#include<bits/stdc++.h>
using namespace std;
const int o = 1e5;
int pre[o], vis[o], last[o];
void find(int x) {
if(pre[x] != -1) {
find(pre[x]);
printf("%04d", pre[x]);
cout << "->";
}
return;
}
int main() {
int n, a, c, m, x;
string s, s1;
vis[0] = 1;
fill(pre, pre + 100000, -1);
cin >> n;
getchar();
getline(cin, s1);
for(int i = 1; i < n; i++) {
c = 0;
getline(cin, s);
a = stoi(s);
while(s[c] == ' ') c++;
last[c] = a;
pre[a] = last[c - 1];
vis[a] = 1;
}
cin >> m;
for(int i = 0; i < m; i++) {
cin >> x;
if(vis[x] == 1) {
find(x);
printf("%04d\n", x);
} else {
printf("Error: %04d is not found.\n", x);
}
}
return 0;
}
4、化学方程?
题目太长了,看不太懂,然后又憋得慌,我直接交卷去撤硕了,这题还是等我多刷点题库才看吧- -
無
总结
总的来说自己太菜,也没刷题库,虽然这次目的是试水(我就是奔着三题去的- -)但感觉这次应该难度不算大吧(不过我之前也没考过就是了),除了第四题应该很难前三题都挺简单的,只不过体验还是有点差,发挥也一般,寒假好好把题库给做了,希望疫情快点结束,线上考简直折磨,希望快快变回线下考,明年嗯冲一波PAT!!