2020记录PAT甲级春季考试 1、 Prime Day 2、 The Judger 3、Safari Park 4、Replace Selection

旧城冷巷雨未停 提交于 2020-08-08 12:46:48

总结:

按这个出题的风格,历年的题应该没啥常考价值了,没有模板体,都得靠平时编码积累。


一、Prime Day

1、题意:给你一个日期字符串,判断字符串及其后缀字符串所对应的数字是否是一个素数。
如果全是素数的话还要输出一个 All Prime!,还有一个测试样例忘记了。
思路:就是利用stoi()和 substr()可以几分钟直接过了这题。

Input Sample

20191231

Output Sample

20191231 Yes
0191231 Yes
191231 Yes
91231 No
1231 Yes
231 No
31 Yes
1 No
#include<bits/stdc++.h>
using namespace std;
bool isprime(int x) {
	if (x < 2) return false;
	for (int i = 2; i*i <= x; i++) {
		if (x%i == 0) return false;
	}
	return true;
}
int main() {
#ifdef ONLINE_JUDGE
#else
	freopen("Text.txt", "r", stdin);
#endif // DEBUG
	string str;
	cin >> str;
	long long num;
	int len = str.length();
	int flag = 1;
	for (int i = 0; i < len; i++) {
		string s = str.substr(i, len - i);
		printf("%s ", s.c_str());
		num = stoi(s);
		if (isprime(num)) {
			printf("Yes\n");
		}
		else {
			printf("No\n");
			flag = 0;
		}
	}
	if (flag == 1) {
		printf("All Prime!");
	}
}

二、The Judger

2、一道模拟题,就是玩一个游戏
一开始给出两个数,一共有n 个人,共m 个回合。在每一个回合中,由轮到的玩家给出一个数,如果这个数在之前已经给出了,或者这个数不能由先前的两个数相减得出那么这个玩家就出局,并且出局的玩家之后给出的数据都会被忽略。输出那一轮那些玩家出局,最后输出所有的胜利者。
思路:两个unordered_set s,ans;s来存已经输入的元素,ans来存所有可以得到的差。

Input Sample

42 101
4 5
59 34 67 9 7
17 9 18 50 49
25 92 58 1 39
102 32 2 6 41

Output Sample

Round #1: 4 is out.
Round #3: 2 is out.
Round #4: 1 is out.
Round #5: 3 is out.
No winner.

还有一个可以输出胜利者的测试样例忘记了。

#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
using namespace std;
unordered_set<int> s,ans;
int A[12][1009];
int N, M;
bool visited[15];
int main() {
#ifdef ONLINE_JUDGE
#else
	freopen("Text.txt", "r", stdin);
#endif // DEBUG
	int num1, num2,sum=0;
	scanf("%d %d", &num1, &num2);
	int diff = abs(num1-num2);//记录其差值
	ans.insert(diff);
	s.insert(num1); s.insert(num2);
	cin >> N >> M;
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= M; j++) {
			scanf("%d", &A[i][j]);
		}
	}
	for (int i = 1; i <= M; i++) {
		for (int j = 1; j <= N; j++) {
			if (visited[j] == true) continue;
			//表示以及存在这个数字了,或者给出了错误的数字(不能由先前给出的两个数字求差得出)
			if (s.find(A[j][i])!=s.end() || ans.find(A[j][i])==ans.end()) {
				visited[j] = true;//踢出去
				printf("Round #%d: %d is out.\n",i,j);
				sum++;//记录胜利者,若为0就表示没有胜利者
				continue;
			}
			s.insert(A[j][i]);
			//每进来一个元素跟新s和ans;
			for (auto it = s.begin(); it != s.end(); it++) {
				ans.insert(abs((*it) - A[j][i]));
			}
		}
	}
	if (sum == N) {
		printf("No winner.");
		return 0;
	}
	else {
		printf("Winner(s):");
		for (int i = 1; i <= N; i++) {
			if (visited[i] == false) printf(" %d", i);
		}
	}
}

三、Safari Park

3、水题,就是动物园里面相邻近的笼子不能放相同的动物,可能是观光者周围要出现不同的动物,按照测试样例来讲一讲。
先给出N,M,K;N表示所有的笼子数量,M表示各笼子之间的连接关系,K表示你一共要放多少动物。然后输入各笼子之间的连接关系(一共M行),可以理解为图的边吧,(其实这也不算图的题)。
再输入一个数T;表示接下来有T个放置方案,你需要来判断结果:
1、如果放置的动物数小于K 输出:Error: Too few species.
2、如果放置的动物数大于K 输出:Error: Too many species.
3、如果放置的动物数等于K :




  1. 若出现相邻的笼子放了相同的动物就输出No;
  2. 若未出现相邻的笼子放了相同的动物就输出Yes;

思路:领接表存储这个图,然后判断相邻节点之间有没有相同的动物

Input Sample

6 8 3
2 1
1 3
4 6
2 5
2 4
5 4
5 6
3 6
5
1 2 3 3 1 2
1 2 3 4 5 6
4 5 6 6 4 5
2 3 4 2 3 4
2 2 2 2 2 2

Output Sample

Yes
Error: Too many species.
Yes
No
Error: Too few species.
#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
vector<int> G[509];
unordered_map<int, bool> mp;
int ani[509];
int main() {
#ifdef ONLINE_JUDGE
#else
	freopen("Text.txt", "r", stdin);
#endif // DEBUG
	int N, M, K;
	cin >> N >> M >> K;
	for (int i = 0; i < M; i++) {
		int u, v;
		cin >> u >> v;
		G[u].push_back(v);
		G[v].push_back(u);
	}
	int num; cin >> num;
	for (int j = 0; j < num; j++) {
		int sum = 0;
		for (int i = 1; i <= N; i++) {
			cin >> ani[i];
			if (mp[ani[i]] == false) {
				sum++;
				mp[ani[i]] = true;
			}
		}
		mp.clear();
		if (sum > K) {
			cout << "Error: Too many species." << endl;
			continue;
		}
		if (sum < K) {
			cout << "Error: Too few species." << endl;
			continue;
		}
		int flag = 1;
		for (int i = 1; i <= N; i++) {
			int len = G[i].size();
			for (int k = 0; k < len; k++) {
				if (ani[G[i][k]] == ani[i]) {
					flag = 0;
					break;
				}
			}
		}
		if (flag == 1) cout << "Yes" << endl;
		else cout << "No" << endl;
	}
}

四、Replace Selection

4、模拟 Replace Selection Sort 的过程,就是说内存不够大只能一次排几个数balabala
好长的英文题,好长好长,不过看看例子就懂了,输入N(数组的长度,输入的元素个数)。K表示一次最多可以排序的个数。
我模拟模拟这个过程:
一开始内存中肯定只有 81 94 11 三个数 排序后就是 11 81 94 然后和数组中的下一个数字进行比较,也就是99,进行比较发现99大于11,所以99和11一个梯队,并从内存中清除11,并将11加入第一梯队,并将99加进去……
过程写的有点着急,字有点丑,大家凑合凑合。



在这里插入图片描述
在这里插入图片描述
思路:有用优先队列的,有用vector的,有用set的。不过vector+sort肯定会超时,当然也可以对sort优化,这道题我最后一个测试点没过55555。留下菜比的眼泪,最好还是用自带排序的容器吧,避免超时。我就是个渣渣,肯定有大佬的思路比我好的多的。
大概就是用两个set来存放当前内存的第一梯队元素和第二梯队元素,然后第一梯队元素输出完了之后就令第二梯队为新的第一梯队,再将第二梯队clear()又能开始存储新的第二梯队元素了。我的渣渣思路,大家就当笑话看吧,最后一个测试点没过。


Input Sample

13 3
81 94 11 96 12 99 17 35 28 58 41 75 15

Output Sample

11 81 94 96 99
12 17 28 35 41 58 75
15
#include<bits/stdc++.h>
using namespace std;
set<int> run, last;
vector<int> v;// , run, last;
const int INF = 0x7fffffff;
vector<int> ans[100000];
int main() {
#ifdef ONLINE_JUDGE
#else
	freopen("Text.txt", "r", stdin);
#endif // ONLINE_JUDGE
	int N, M; cin >> N >> M;
	for (int i = 0; i < N; i++) {
		int temp; cin >> temp;
		v.push_back(temp);
	}
	for (int i = 0; i < M; i++) {
		run.insert(v[i]);
	}
	int cnt = 0;
	for (int i = M; i < N; i++) {
		if (*run.begin() == INF) {
			run = last;
			last.clear();
			cnt++;
		}
		if (*run.begin() < v[i]) {
			ans[cnt].push_back(*run.begin());
			run.erase(run.begin());
			run.insert(v[i]);
		}
		else {
			ans[cnt].push_back(*run.begin());
			run.erase(run.begin());
			run.insert(INF);
			last.insert(v[i]);
		}
	}
	for (int i = 0; i <= cnt; i++) {
		int len = ans[i].size();
		for (int j = 0; j < len; j++) {
			printf("%d", ans[i][j]);
			if (j != len - 1) printf(" ");;
		}
		if (i != cnt) printf("\n");
	}
	if (run.size() != 0) {
		for (auto it = run.begin(); it != run.end(); it++) {
			if (*it != INF) printf(" %d", *it);
		}
	}
	printf("\n");
	if (last.size() != 0) {
		printf("%d", *last.begin());
		for (auto it = last.begin(); it != last.end(); it++) {
			if (it == last.begin()) continue;
			 printf(" %d", *it);
		}
	}
}

总场考试下来就90来分,100多名好像,我太废物了太废物了,第二题 different 和 difference 傻傻分不清,浪费了1个小时。 一直在想not be duplicated 和 different 不是同一个意思吗,后来才发现是the difference of two nums previously…差。

考完就开始一直写,一直写一直写,求个赞鼓励鼓励

最后希望大佬帮忙指出错误,让我学习学习,今年9月再战。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!