关于PAT乙级一些题目要点的重新整理(三)

1050(题目及原解答https://blog.csdn.net/g28_gwf/article/details/81569622
1.建立坐标系,将几个关键位置的坐标写出来,方便思考
2.注意不要产生数据的位置重叠,否则会有数据被覆盖
3.m、n与level的确定:求出N的开方数,向下取整。从此数开始,向下判断是否可被N整除,若可以则此数为n,得到n后便可求m。level为m除以2向上取整

#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
bool cmp(int a, int b){
	return a > b;
}
int main(){
	int N;
	cin >> N;
	vector<int> v(N);
	for(int i = 0; i < N; i++){
		cin >> v[i];
	}
	sort(v.begin(), v.end(), cmp);
	int temp = sqrt(N);
	while(temp != 0){
		if(N % temp == 0){
			break;
		}
		temp--;
	}
	int n = temp;
	int m = N / n;
	int level = m / 2 + m % 2;
	vector<vector<int> > arr(m);
	for(int i = 0; i < m; i++){
		arr[i].resize(n);
	}
	int index = 0;
	for(int i = 0; i < level; i++){
		for(int j = i; j < n - i - 1 && index < N; j++){
			arr[i][j] = v[index++];
		}
		for(int j = i; j < m - i - 1 && index < N; j++){
			arr[j][n - i - 1] = v[index++];
		}
		for(int j = n - i - 1; j > i && index < N; j--){
			arr[m - i -1][j] = v[index++];
		}
		for(int j = m - i - 1; j > i && index < N; j--){
			arr[j][i] = v[index++];
		}
	}
	for(int i = 0; i < m; i++){
		for(int j = 0; j < n; j++){
			if(j != n - 1){
				cout << arr[i][j] << ' ';
			}else{
				cout << arr[i][j] << endl;
			} 
		}
	}
	return 0;
}

1051(题目及原解答https://blog.csdn.net/g28_gwf/article/details/81518044
1.注意A与B在>=-0.005, < 0时输出0.00

#include<iostream>
#include<cmath>
using namespace std;
int main(){
	double R1, P1, R2, P2;
	cin >> R1 >> P1 >> R2 >> P2;
	double A1 = R1 * cos(P1), B1 = R1 * sin(P1);
	double A2 = R2 * cos(P2), B2 = R2 * sin(P2);
	double A = A1 * A2 - B1 * B2, B = A1 * B2 + B1 * A2;
	if(A >= -0.005 && A <= 0){
		printf("0.00");
	}else{
		printf("%.2lf", A);
	}
	if(B >= -0.005 && B <= 0){
		printf("+0.00i\n");
	}else if(B > 0){
		printf("+%.2lfi\n", B);
	}else{
		printf("%.2lfi\n", B);
	}
	return 0;
}

1052(题目及原解答https://blog.csdn.net/g28_gwf/article/details/81532761
1.无开头结尾的输入输出采用字符串整行输入
2.注意所需符号为字符串时,可以先设一空串,将字符逐个与之相加得到所需符号

#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main(){
	vector<string> v[3];
	for(int i = 0; i < 3; i++){
		string s;
		getline(cin, s);
		for(int j = 0; j < s.size(); j++){
			string temp = "";
			if(s[j] == '['){
				int index = j + 1;
				while(s[index] != ']'){
					temp += s[index++];
				}
				v[i].push_back(temp);
			}
		}
	}
	int N;
	cin >> N;
	for(int i = 0; i < N; i++){
		int H1, E1, M, E2, H2;
		cin >> H1 >> E1 >> M >> E2 >> H2;
		H1--;
		E1--;
		M--;
		E2--;
		H2--;
		if(H1 < v[0].size() && E1 < v[1].size() && M < v[2].size() &&
			E2 < v[1].size() && H2 < v[0].size()){
			printf("%s(%s%s%s)%s\n", v[0][H1].c_str(), v[1][E1].c_str(), v[2][M].c_str(), v[1][E2].c_str(), v[0][H2].c_str());
		}else{
			cout << "Are you kidding me? @\\/@" << endl;			
		}
	}
	return 0;
}

1054(题目及原解答https://blog.csdn.net/g28_gwf/article/details/81588389
1.思路:向s1输入字符串,用sscanf从s1向d输入浮点数(无需限制数位),然后用sprintf从d向s2输入字符串,若s1与s2相同则合法
2.s1、s2最好用字符数组,且长度最好设在50以上,否则会RE

#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int main(){
	int N;
	cin >> N;
	double ans = 0;
	int cnt = 0;
	for(int i = 0; i < N; i++){
		char s1[50], s2[50];
		double d;
		scanf("%s", s1);
		sscanf(s1, "%lf", &d);
		sprintf(s2, "%.2lf", d);
		bool isValid = true;
		for(int j = 0; j < strlen(s1); j++){
			if(s1[j] != s2[j]){
				isValid = false;
				break;
			}
		}
		if(isValid == true && fabs(d) <= 1000){
			ans += d;
			cnt++;
		}else{
			printf("ERROR: %s is not a legal number\n", s1);
		}
	}
	if(cnt == 0){
		cout << "The average of 0 numbers is Undefined" << endl;
	}else if(cnt == 1){
		printf("The average of %d number is %.2lf\n", cnt, ans);
	}else{
		printf("The average of %d numbers is %.2lf\n", cnt, ans / cnt);
	}
	return 0;
}

1055(题目及原解答https://blog.csdn.net/g28_gwf/article/details/81589975
1.完成输入数据、排序等任务后,从最后一行开始,两个循环从中间向两边输出
2.将行数作为变量进行循环

#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
struct Stu{
	string name;
	int height;
};
bool cmp(Stu a, Stu b){
	if(a.height != b.height){
		return a.height > b.height;
	}else if(a.name != b.name){
		return a.name < b.name;
	}
}
int main(){
	int N, K;
	cin >> N >> K;
	getchar();
	vector<Stu> v(N);
	for(int i = 0; i < N; i++){
		cin >> v[i].name >> v[i].height;
	}
	sort(v.begin(), v.end(), cmp);
	int row = K;
	int index = 0;
	int m;
	while(row != 0){
		if(row == K){
			m = N / K + N % K; 
		}else{
			m = N / K;
		}
		vector<Stu> line(m);
		int i1 = index;
		int i2 = index + 1;
		for(int i = m / 2; i < line.size(); i++, i1 += 2){
			line[i] = v[i1];
		}
		for(int i = m / 2 - 1; i >= 0; i--, i2 += 2){
			line[i] = v[i2];
		}
		for(int i = 0; i < line.size(); i++){
			if(i != line.size() - 1){
				cout << line[i].name << ' ';
			}else{
				cout << line[i].name << endl;
			}
		}
		index += m;
		row--;
	}
	return 0;
}

1060(题目及原解答https://blog.csdn.net/g28_gwf/article/details/81613325
1.E的值不应当直接从数列中取,因为E可能为不存在于数列中的数
2.第N个数应大于N而不是大于等于N(v[i] > i + 1)

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
bool cmp(int a, int b){
	return a > b;
}
int main(){
	int N;
	cin >> N;
	vector<int> v(N);
	for(int i = 0; i < N; i++){
		cin >> v[i];
	}
	sort(v.begin(), v.end(), cmp);
	int E = 0;
	for(int i = 0; i < v.size(); i++){
		if(v[i] <= i + 1){
			break;
		}
		E++;
	}
	cout << E << endl;
	return 0;
} 

1068(题目及原解答https://blog.csdn.net/g28_gwf/article/details/81674523
1.所符合要求的点并不是周围八个均色差充分大,而是没有不超过TOL的点

#include<iostream>
#include<cmath>
#include<map>
#define maxN 1001
using namespace std;
long pic[maxN][maxN] = {0};
int dire[8][2] = {{-1, -1}, {0, -1}, {1, -1}, {-1, 0}, {1, 0}, {-1, 1}, {0, 1}, {1, 1}};
int main(){
	map<int, int> m;
	long M, N, TOL;
	cin >> M >> N >> TOL;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			cin >> pic[i][j];
			m[pic[i][j]]++;
		}
	}
	bool isUnique = true;
	bool isExist = false;
	int x, y;
	long value;
	for(int i = 0; i < N; i++){
		for(int j = 0; j < M; j++){
			bool isValid = true;
			if(m[pic[i][j]] == 1){
				int cnt = 0;
				for(int k = 0; k < 8; k++){
					int ni = i + dire[k][0];
					int nj = j + dire[k][1];
					if(ni >= 0 && ni < N && nj >= 0 && nj < M && abs(pic[ni][nj] - pic[i][j]) <= TOL){
					 	cnt++;
					 }
				}
				if(cnt == 0){
					if(isExist == false){
						x = j + 1;
						y = i + 1;
						value = pic[i][j];
						isExist = true;
					}else if(isExist == true){
						isUnique = false;
					}
				}			
			}
		}
	}	
	if (isExist == false) {
		cout << "Not Exist" << endl;
	}
	if (isUnique == false) {
		cout << "Not Unique" << endl;
	}
	if (isExist == true && isUnique == true) {
		printf("(%d, %d): %ld\n", x, y, value);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/g28_gwf/article/details/82505527