2019春季PAT甲级考试总结及注意事项

有关考试需要注意的地方
1.需要打印准考证,黑白的还是彩印的都可以,这个无所谓,
2.考试提前10分钟到场即可,去得早也不开门,这个可能只适合武汉考试的同学
3.进入考场前,考场门口一般会张贴的有各个学生的姓名、准考证号、座位号,注意查看自己的座位号,进入考场后快速入座
4.进入考场后,依据座位号找到自己的座位入座,今年这场每台电脑上都有考生的照片及个人信息,注意验证
5.这时候考试前大概还有8分钟的时间,可以测试一下键盘的按键,以及提前编写如下的代码,并复制4份保存(因为现在就是你自己的座位,考试开始会方便一点)

#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <string>
using namespace std;
int main(){

return 0;
}

6.注意有的考场不会提醒开始考试,考试也不是自动开始,可以在1:25-1:30这段时间手动选择开始考试,
7. 甲级考试一定要注意读题,注意读题,注意读题
8. 考试结束会以最后一次上传的代码为准,中间可以看到自己当前的提交和排名和分数,考试一般不是很难,放平心态,细心细心,

试题内容总结

1.Sexy Primes
思路:写一个判断是否为素数的函数,对n, n-6, n+6进行判断,如果小的那个数满足就直接输出返回,否则对n+6进行验证。注意,若n不满足时,需要找到的是比n大的一个6-素数对,而不是任意一个素数都可以,刚开始没意识到这一点,有两个测试点一直过不去,但是example又可以过,迷了一段时间,所以一定要认真读题!!!

#include <iostream>
using namespace std;
bool isprime(long long x){
	if(x < 2)
		return false;
	for(long long i = 2; i*i <= x; i++){
		if(x%i == 0)
			return false;
	}
	return true;
}
int main(){
	long long n;
	cin>>n;
	long long x = n-6, y = n+6, ans = 0;
	if(isprime(n) && isprime(x))
		ans = x;
	else if(isprime(n) && isprime(y))
		ans = y;
	if(ans != 0){
		printf("Yes\n%lld", ans);
		return 0;
	}
	while(!(isprime(n)&&(isprime(n-6) || isprime(n+6)) )){
		n++;
	}
	printf("No\n%lld", n);
	return 0;
}

2.Anniversary 对参加校庆的人员进行统计分析
思路:使用map<string, int>来建立一个参加校庆的校友数组,若参加校庆人员在该数组中值为1,则说明其是校友,参加校友人员数加一,压入参加校庆的校友的数组中,通过判断参加的校友数来输出不同的信息,年龄大小直接使用sort排序

#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <string>
using namespace std;
bool cmp1(string a, string b){
	return a.substr(6,8) < b.substr(6,8);
}
int main(){
	int n , m, cnt = 0;
	string temp;
	map<string, int> stu;
	cin>>n;
	for(int i = 0; i < n; i++){
		cin>>temp;
		stu[temp] = 1;
	}
	scanf("%d", &m);
	vector<string> guest(m);
	vector<string> ans;
	for(int i = 0; i < m; i++){
		cin>>temp;
		guest[i] = temp;
		if(stu[temp] == 1){
			cnt++;
			ans.push_back(temp);
		}		
	}	
	printf("%d\n", cnt);
	if(cnt != 0){
		sort(ans.begin(), ans.end(), cmp1);
		cout<<ans[0]<<endl;
	}else{
		sort(guest.begin(), guest.end(), cmp1);
		cout<<guest[0]<<endl;
	}
	return 0;
}

3.Telefraud Detection
思路:依据规则分析电信诈骗嫌疑人及其群体,使用一个二维整型数组存储任意两人之间的通话信息,为0表示没有通话,1表示为短通话,2表示为一般通话,刚开始没有考虑一般通话,出现了问题,
再寻找群体时,本来是打算使用并查集去做,但是不太熟练没有想明白,采用的是设立一个visit数组,遍历所有嫌疑人,若与其他人有通信,则在同一行进行输出,并将该嫌疑人设为已遍历,感觉这个思路应该也可以,但是不知道为什么有一个测试点总是无法通过

#include <cstdio>
#include <vector>
using namespace std;
int map[1010][1010] = {0};

int main(){
	int k,n, m;
	vector<int> ans;
	scanf("%d %d %d", &k, &n, &m);
	int x,y,t;
	for(int i = 0; i < m ; i++){
		scanf("%d %d %d", &x, &y, &t);
		if(t <= 5)
			map[x][y] = 1;
		else
			map[x][y] = 2;
	}
	for(int i = 1; i <= n; i++){
		int a = 0, b = 0;
		for(int j = 1; j<= n; j++){
			if(map[i][j] == 1){
				a++;
				if(map[j][i]!=0)
					b++;
			}
		}
		if(a>k && b<=a/5)
			ans.push_back(i);
	}
	if(ans.size() == 0){
		printf("None");
		return 0;
	}
	int vis[1010] = {0}, flag = 0;

	for(int i= 0; i < ans.size(); i++){
		if(vis[ans[i]] == 0){
			if(flag == 1){
				printf("\n");
			}
			flag = 1;
			vis[ans[i]] = 1;
			printf("%d", ans[i]);
		}else
			continue;
		for(int j = 0; j < ans.size(); j++){
			if(i!=j && (map[ans[i]][ans[j]] != 0 || map[ans[j]][ans[i]] != 0) && vis[ans[j]] == 0){
				vis[ans[j]] = 1;
				printf(" %d", ans[j]);
			}
		}		
	}
	return 0;
}

4.Structure of a Binary Tree
思路:考试时给这道题留了一个半小时左右还是没写完,主要是没复习到怎么依据中序和后序建树,现场推错了好多遍,find函数忘记是返回迭代器了,考场dev使用的不是C++ 11规则,不支持stoi,然后,emm心态炸了
题目其实并不难,主要考察知识点就是通过中序和后序建树,然后对二叉树进行相关测试,由于数据量较小,结点值都小于1000,我这里直接采用tree二维数组来表示一棵树,一个结点的值直接表示它的序号,tree[i][0]表示结点i的左孩子,tree[i][1]表示结点i的右孩子,tree[i][2]表示结点i的父亲结点,由于问题中涉及兄弟结点、父亲结点、同层结点的问题,所以能够指向父亲结点的位置可以大大简化问题,
在对指令进行分析的过程中,需要stringstream这个类型的变量,不知道的同学可以百度一下,查看详细用法,使用它需要导入< sstream >头文件,主要用法如下

		getline(cin, temp);
		stringstream ss(temp);
		vector<string> que;
		while(ss>>x)
			que.push_back(x);

由于不知道每条指令的长度,使用stringstream可以方便的对每条指令的各个单词进行分割,分割之后我们就可以依据关键词(如root, parent, siblings)来判断是要执行什么操作了,接下来就很简单了。
emm,由于我考试时是没能做出这道题的,所以下来之后对代码进行完善测试,现在能够通过例子,但也不确定正确性怎么样,大家可以参考一下思路

#include <iostream>
#include <vector>
#include <sstream>
#include <string>

using namespace std;
int tree[1010][3];
int n,m,root;
int post[30] = {0};
int in[30] = {0};
void build(int pb, int pe, int ib, int ie){
	if(pb<0 || ib<0 ||pe >= n || ie>= n || pe<pb || ie<ib){
		return;
	}
	int r = post[pe];
	int j = 0;
	for(j = ib; j <= ie; j++){
		if(in[j]==r)
			break;
	}
	if(j-1>=ib){
		tree[r][0] = post[pb+j-1-ib];
		tree[post[pb+j-1-ib]][2] = r; 
		build(pb, pb+j-1-ib, ib, j-1);
	}
	if(j+1<=ie){
		tree[r][1] = post[pe-1];
		tree[post[pe-1]][2] = r;
		build(pb+j-ib, pe-1, j+1, ie);
	}	
}
bool islevel(int a, int b){
	int da = 0, db = 0;
	while(a != root){
		da++;
		a = tree[a][2];
	}
	while(b != root){
		db++;
		b = tree[b][2];
	}
	if(da == db)
		return true;
	else
		return false;
}
bool isfull(){
	int x = root;
	for(int i = 1; i <= n; i++){
		//要么有两个孩子要么没有孩子 
		if(!(tree[i][0] == 0 && tree[i][1]==0 || tree[i][0]!=0 && tree[i][1]!=0))
			return false;
	}
	return true;
}
int main(){
	string temp, x;
	scanf("%d", &n);
	for(int i = 0; i < n; i++)
		scanf("%d", &post[i]);
	for(int i = 0; i < n; i++)
		scanf("%d", &in[i]);
	root = post[n-1];
	build(0, n-1, 0, n-1); 	
	scanf("%d\n", &m);
	for(int i = 0; i < m; i++){
		getline(cin, temp);
		stringstream ss(temp);
		vector<string> que;
		while(ss>>x)
			que.push_back(x);
		if(que[que.size()-1] == "root"){
			if(root == stoi(que[0]))
				printf("Yes\n");
			else
				printf("No\n");
		}else if(que[que.size()-1] == "siblings"){
			int a = stoi(que[0]);
			int b = stoi(que[2]);
			int f = tree[a][2];
			if(tree[f][0]==a && tree[f][1]==b || tree[f][0]==b && tree[f][1]==a)
				printf("Yes\n");
			else
				printf("No\n");
		}else if(que[3] == "parent"){
			int f = stoi(que[0]);
			int a = stoi(que[5]);
			if(tree[a][2] == f)
				printf("Yes\n");
			else
				printf("No\n");		
		}else if(que[3] == "left"){
			int f = stoi(que[6]);
			int a = stoi(que[0]);
			if(tree[f][0] == a)
				printf("Yes\n");
			else
				printf("No\n");				
		}else if(que[3] == "right"){
			int f = stoi(que[6]);
			int a = stoi(que[0]);
			if(tree[f][1] == a)
				printf("Yes\n");
			else
				printf("No\n");				
		}else if(que[que.size()-1] == "level"){
			int a = stoi(que[0]);
			int b = stoi(que[2]);
			printf("%s\n", islevel(a,b)?"Yes":"No"); 
		}else if(que[que.size()-1] == "tree"){
			printf("%s\n", isfull()?"Yes":"No"); 
		}
	}	
	return 0;
}
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值