Today一只菜鸡的PAT甲级测试(PAT1124, PAT1125, PAT1126, PAT1127)

本文分享了一次PAT考试的经历及心得,详细解析了四道题目:A题字符串处理、B题排序与遍历计算、C题欧拉图概念、D题树结构层序遍历。作者通过实战总结了考试中遇到的问题及解决思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

夜晚,总是个适合反思自己的时间,于是总结一下今天的PAT考试吧

今天,是浙大一年三度的PAT考试3月4日春季考试,本菜鸡也参加了甲级考试,其实网上说PAT甲级是越来越简单了,今天第一次参加的我也有所感查,所以我还是只考了62分的"高分段",但是真的考的很基础,涉及算法应该说是很浅很浅,由此还是显示了本人的基础只差和本人的英语水平之low。

进入正题,A题其实就是个简单的处理字符串的题,可是由于我的英语水平而误解题目的意思将其理解成每n个求第s个。。总之就是搞得好复杂,而且这题测试点也是真坑,给我过了3个测试点只有1个测试点不过,让我执着于此直至考试结束,而A题的正确题意是从第s个字符串为第一个winner开始,然后之后第n个为下一个winner,如果这个winner在之前被选过,则看之后第n+1个,然后从之后的第n+1再+n。。总之很水,代码来理解。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char jk[1005][25];
char hk[1005][25];
int u;
int check(char s[]){
	int j, l, i;
	for(i = 0; i < u; ++i){
		j = 0;
		while(s[j] == hk[i][j] && s[j] != '\0' && hk[i][j] != '\0'){
			++j;
		}
		if(s[j] == '\0' && hk[i][j] == '\0') return 0;
	}
	return 1;
}
int main(){
	int m, n, s, i;
	cin >> m >> n >> s;
	for(i = 1; i <= m; ++i)
		cin >> jk[i];
	if(s > m) printf("Keep going...\n");
	else{
		u = 0;
		for(i = s; i <= m; i+=n){
			while(!check(jk[i])) ++i;
			strcpy(hk[u++], jk[i]);
		}
		if(u == 0) printf("Keep going...\n");
		else{
			for(i = 0; i < u; ++i)
				printf("%s\n", hk[i]);
		}
	}
	return 0;
}

B题更简单,题意得最后一个单词解救人生——halved,就是一个简单的排序之后,然后进行遍历计算的题。

#include <algorithm>
#include <iostream>
#include <cstdio>
#include <vector>
#include <map>
#include <set>
using namespace std;
int jk[10005];
int main(){
	int n, i, ans;
	cin >> n;
	for(i = 0; i < n; ++i){
		cin >> jk[i];
	}
	sort(jk, jk+n);
	ans = jk[0];
	for(i = 1; i < n; ++i){
		ans = (ans+jk[i])/2;
	}
	printf("%d\n", ans);
	return 0;
}

C题考的是欧拉图和半欧拉图的概念= =,由于基础不牢,我用的dfs枚举边,然后有一个测试点超时。

#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <map>
#include <set>
using namespace std;
int f[505], ans[505];
int getF(int x){
	if(x == f[x]) return x;
	else{
		f[x] = getF(f[x]);
		return f[x];
	}
}
void merge(int a, int b){
	int fa, fb;
	fa = getF(a), fb = getF(b);
	if(fa != fb) f[fb] = fa;
}
int main(){
	int n, m, i, a, b, k;
	cin >> n >> m;
	for(i = 1; i <= n; ++i){
		f[i] = i;
		ans[i] = 0;
	}
	for(i = 1; i <= m; ++i){
		cin >> a >> b;
		++ans[a];
		++ans[b];
		merge(a, b);
	}
	k = 0;
	for(i = 1; i <= n; ++i){
		if(i != n) printf("%d ", ans[i]);
		if(ans[i] % 2 == 1) ++k;
	}
	if(n > 0) printf("%d\n", ans[n]);
	for(i = 2; i <= n; ++i){
		if(getF(i) != getF(1)) break;
	}
	if(i == n+1) {
		if(k == 0) printf("Eulerian\n");
		else if(k == 2) printf("Semi-Eulerian\n");
		else printf("Non-Eulerian\n");
	}
	else printf("Non-Eulerian\n");
	return 0;
}

D题和以往一样,和树有关的题,其实也不难,上午刚实现完avl树的代码,所以还是比较有把握,但是越有把握最后我也死的越惨,将树构建出来之后,层序遍历的改版在我仅剩的十多分钟内果真没有实现出来,于是30分完全流失,想想都心痛,唉。

这题遍历的时候利用了队列和栈的特性进行转换达到要求效果。

#include <algorithm>  
#include <iostream>  
#include <cstring>  
#include <cstdio>  
#include <vector>  
#include <queue>  
#include <stack>
#include <map>  
#include <set>  
using namespace std;  
typedef struct node{  
    int value, index;  
    node *lson, *rson;  
} *Lnode;  
int jk[900];  
int hk[900];  
int getIndex(int e, int n);  
Lnode insert(Lnode T, int id, int value);  
void Visit(Lnode L);  
int main(){  
    int i, n, id;  
    cin >> n;  
    Lnode T;  
    for(i = 1; i <= n; ++i) cin >> jk[i];  
    for(i = 1; i <= n; ++i) cin >> hk[i];  
    T = (Lnode)malloc(sizeof(node));  
    T->value = hk[n];  
    T->index = getIndex(hk[n], n);  
    T->lson = T->rson = NULL;  
    for(i = n-1; i >= 1; --i){  
        id = getIndex(hk[i], n);  
        T = insert(T, id, hk[i]);  
    }  
    Visit(T);  
    return 0;  
}  
int getIndex(int e, int n){  
    int i;  
    for(i = 1; i <= n; ++i)  
    if(e == jk[i]) return i;  
}  
Lnode insert(Lnode T, int id, int value){  
    if(T == NULL){  
        T = (Lnode)malloc(sizeof(node));  
        T->value = value;  
        T->index = id;  
        T->lson = T->rson = NULL;  
    }  
    else if(id > T->index){  
        T->rson = insert(T->rson, id, value);  
    }  
    else if(id < T->index){  
        T->lson = insert(T->lson, id, value);  
    }  
    return T;  
}  
void Visit(Lnode T){  
    queue<Lnode> q;
    stack<Lnode> st;
    int key = 0;
    if(T == NULL) return;
    q.push(T);
    while(!q.empty() || !st.empty()){
		while(!q.empty()){
			Lnode x = q.front();
			q.pop();
			cout << x->value;
	    	if(key){
	    		if(x->lson != NULL) st.push(x->lson);
	    		if(x->rson != NULL) st.push(x->rson);
	    	}
	    	else{
	    		if(x->rson != NULL) st.push(x->rson);
				if(x->lson != NULL) st.push(x->lson);
	    	}
	    	if(!q.empty() || !st.empty()) cout << " ";
	    	else cout << endl;
		}
		while(!st.empty()){
			q.push(st.top());
			st.pop();
		}
		key ^= 1;
    }
}  

虽然本人做的如此水,但实际还是有很多得满分的,自己继续加油吧,向着前方潜行。

明天集训队组队赛,该睡觉了~


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值