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

1003(题目及原解答https://blog.csdn.net/g28_gwf/article/details/81436606
1.统计某字符出现次数和种类用map最好
2.注意输出时NO和No的区别

#include<iostream>
#include<map>
#include<string>
using namespace std;
int main(){
	int N;
	cin >> N;
	getchar();
	for(int i = 0; i < N; i++){
		string s;
		map<char, int> m;
		cin >> s;
		int indexP = 0, indexT = 0;
		for(int j = 0; j < s.size(); j++){
			m[s[j]]++;
			if(s[j] == 'P'){
				indexP = j;
			}
			if(s[j] == 'T'){
				indexT = j;
			}
		}
		if(m.size() == 3 && m['P'] == 1 && m['T'] == 1 && 
		 indexT - indexP >= 2 && indexP * (indexT - indexP - 1) == (s.size() - indexT - 1)){
			cout << "YES" << endl;
		}else{
			cout << "NO" << endl;
		}
	}
	return 0;
}

1010(题目及原解答https://blog.csdn.net/g28_gwf/article/details/79991863
1.注意输出:当输入仅有一组数(此时指数必为0)时,注意输出   “0 0”

#include<iostream>
using namespace std;
int main(){
	int a, b;
	bool isFirst = true;
	while(cin >> a >> b){
		if(b != 0){
			if(isFirst == true){
				cout << a * b << ' ' << b - 1;
				isFirst = false;
			}else{
				cout << ' ' << a * b << ' ' << b - 1;
			}	
		}else{
			break;
		}
	}
	if(isFirst == true){
		cout << "0 0";
	}
	return 0;
}

1014(题目及原解答https://blog.csdn.net/g28_gwf/article/details/80018677
1.在同一循环里判断时要注意break的使用

#include<iostream>
#include<map>
#include<string>
using namespace std;
int main(){
	string s1, s2, s3, s4;
	cin >> s1 >> s2 >> s3 >> s4;
	int len1 = s1.size() < s2.size() ? s1.size() : s2.size();
	int len2 = s3.size() < s4.size() ? s3.size() : s4.size();
	bool isFirst = true;
	map<char, string> m;
	m['A'] = "MON";
	m['B'] = "TUE";
	m['C'] = "WED";
	m['D'] = "THU";
	m['E'] = "FRI";
	m['F'] = "SAT";
	m['G'] = "SUN";
	string DAY;
	int HH, MM;
	for(int i = 0; i < len1; i++){
		if(s1[i] == s2[i]){
			if(s1[i] >= 'A' && s1[i] <= 'G' && isFirst == true){
				DAY = m[s1[i]];
				isFirst = false;
			}else if((s1[i] >= '0' && s1[i] <= '9' || s1[i] >= 'A' 
				&& s1[i] <= 'N') && isFirst == false){
				if(s1[i] >= '0' && s1[i] <= '9'){
					HH = s1[i] - '0';
				}else{
					HH = s1[i] - 'A' + 10;
				}
				break;
			}
		}
	} 
	for(int i = 0; i < len2; i++){
		if(s3[i] == s4[i] && (s3[i] >= 'A' && s3[i] <= 'Z' ||
			s3[i] >= 'a' && s3[i] <= 'z')){
			MM = i;
			break;
		}
	}
	cout << DAY << ' ';
	printf("%02d:%02d\n", HH, MM);
	return 0;
}

1015(题目及原解答https://blog.csdn.net/g28_gwf/article/details/80018769
1.程序结构简单但超时,把cin,cout换成scanf,printf
2.注意多维vector的使用
3.学号不要用string存,会排序失败

#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
struct Stu{
	int ID;
	int D;
	int C;
	int grade;
};
bool cmp(Stu a, Stu b){
	if(a.grade != b.grade){
		return a.grade > b.grade;
	}else if(a.D != b.D){
		return a.D > b.D;
	}else if(a.ID != b.ID){
		return a.ID < b.ID;
	}
}
int main(){
	int N, L, H;
	cin >> N >> L >> H;
	vector<Stu> v[4];
	getchar();
	for(int i = 0; i < N; i++){
		int ID;
		int D, C;
		scanf("%d %d %d", &ID, &D, &C);
		if(C >= L && D >= L){
			if(D >= H && C >= H){
				v[0].push_back(Stu{ID, D, C, D + C});
			}else if(D >= H && C < H){
				v[1].push_back(Stu{ID, D, C, D + C});
			}else if(D < H && C < H && D >= C){
				v[2].push_back(Stu{ID, D, C, D + C});
			}else{
				v[3].push_back(Stu{ID, D, C, D + C});
			}		
		}
	}
	for(int i = 0; i < 4; i++){
		sort(v[i].begin(), v[i].end(), cmp);	
	}
	cout << v[0].size() + v[1].size() + v[2].size() + v[3].size() << endl;
	for(int i = 0; i < 4; i++){
		for(int j = 0; j < v[i].size(); j++){
			printf("%d %d %d\n", v[i][j].ID, v[i][j].D, v[i][j].C);
		}
	}
	return 0;
}

1017 (题目及原解答https://blog.csdn.net/g28_gwf/article/details/81447907
1.注意去除输出中第一个0的正确方法:在输出字符串的时候,若某数非0且为第一个非0数,则从次数开始输出
2.若最后输出字符串长度不为0且没有输出过,说明数值为0,应当手动输出一个0

#include<iostream>
#include<string>
using namespace std;
int main(){
	string A, Q = "";
	int B, R = 0;
	cin >> A >> B;
	int q;
	for(int i = 0; i < A.size(); i++){
		q = R * 10 + A[i] - '0';
		R = q % B;
		Q += q / B + '0';
	}
	bool isFirst = true;
	for(int i = 0; i < Q.size(); i++){
		if(isFirst == true){
			if(Q[i] != '0'){
				cout << Q[i];
				isFirst = false;
			}
		}else{
			cout << Q[i];
		} 
	}
	if(isFirst == true && Q.size() != 0){
		cout << '0';
	}
	cout << ' ' << R << endl;
	return 0;
}

1018(题目及原解答https://blog.csdn.net/g28_gwf/article/details/80170322
1.用map储存次数时可能会遇到某元素未出现的情况,此时要为map的键值对做初始化,如全部赋0

#include<iostream>
#include<vector>
#include<map>
using namespace std; 
int main(){
	int N;
	cin >> N;
	map<char, int> jW;
	jW['B'] = 0;
	jW['J'] = 0;
	jW['C'] = 0;
	map<char, int> yW;
	yW['B'] = 0;
	yW['J'] = 0;
	yW['C'] = 0;
	vector<int> j(3);
	vector<int> y(3);
	for(int i = 0; i < N; i++){
		char A, B;
		cin >> A >> B;
		if(A == 'C' && B == 'J' || A == 'J' && B == 'B' 
			|| A == 'B' && B == 'C'){
			jW[A]++;
			j[0]++;
			y[2]++;
		}else if(B == 'C' && A == 'J' || B == 'J' && A == 'B' 
			|| B == 'B' && A == 'C'){
			yW[B]++;
			y[0]++;				
			j[2]++;				
		}else if(A == B){
			j[1]++;
			y[1]++;
		}
	}
	for(int i = 0; i < 3; i++){
		if(i != 2){
			cout << j[i] << ' ';
		}else{
			cout << j[i] << endl;
		}
	}
	for(int i = 0; i < 3; i++){
		if(i != 2){
			cout << y[i] << ' ';
		}else{
			cout << y[i] << endl;
		}
	}
	int maxN = -1;
	char index;
	for(auto it = jW.begin(); it != jW.end(); it++){
		if(maxN < it->second){
			maxN = it->second;
			index = it->first;
		}
	}
	cout << index << ' ';
	maxN = -1;
	for(auto it = yW.begin(); it != yW.end(); it++){
		if(maxN < it->second){
			maxN = it->second;
			index = it->first;
		}
	}
	cout << index << endl;
	return 0;
}

1020(题目及原解答https://blog.csdn.net/g28_gwf/article/details/80170985
1.没有明确指定类型的数据应当使用double来储存

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
struct Cake{
	double total;
	double amount;
	double price;
};
bool cmp(Cake a, Cake b){
	return a.price > b.price;
}
int main(){
	int N;
	double D;
	cin >> N >> D;
	vector<Cake> v(N);
	for(int i = 0; i < N; i++){
		cin >> v[i].amount;
	}
	for(int i = 0; i < N; i++){
		cin >> v[i].total;
		v[i].price = 1.0 * v[i].total / v[i].amount;
	}
	sort(v.begin(), v.end(), cmp);
	double ans = 0.0;
	for(int i = 0; i < N; i++){
		if(D > v[i].amount){
			ans += v[i].total;
			D -= v[i].amount;
		}else{
			ans += v[i].price * D;
			break;
		}
	}
	printf("%.2lf\n", ans);
	return 0;
}

1024(题目及原解答https://blog.csdn.net/g28_gwf/article/details/80208686
1.不需要用声明新的字符串,直接输出新字符串即可
2.当指数e大于0时,小数点所需右移位数为e + 2个

#include<iostream>
#include<cstdlib>
#include<string>
using namespace std;
int main(){
	string s;
	cin >> s;
	if(s[0] == '-'){
		cout << '-';
	}
	string num = "";
	string n = "";
	int i;
	for(i = 1; s[i] != 'E'; i++){
		num += s[i];
	}
	i++;
	for(; i < s.size(); i++){
		n += s[i];
	}
	int e = atoi(n.c_str());
	if(e < 0){
		cout << "0.";
		for(int i = 0; i < -e - 1; i++){
			cout << '0';
		}
		for(int i = 0; i < num.size(); i++){
			if(num[i] != '.'){
				cout << num[i];
			}		
		}
	}else{
		int len = 0;
		int i;
		for(i = 0; i < num.size() && len < e + 2; len++, i++){
			if(num[i] != '.'){
				cout << num[i];
			}
		}
		if(i != num.size()){
			cout << '.';
			while(i != num.size()){
				cout << num[i++];
			}
		}
		if(len != e){
			while(len != e + 2){
				cout << '0';
				len++;
			}
		}
	}
	return 0;
}

1025(题目及原解答https://blog.csdn.net/g28_gwf/article/details/80377433
1.节点数量与实际adddress不同(不知道为什么)

#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
struct Node {
	int Address;
	int Data;
	int Next;
};
int main() {
	vector<int> address;
	map<int, Node> m;
	int head, N, K;
	cin >> head >> N >> K;
	for (int i = 0; i < N; i++) {
		int add;
		cin >> add;
		cin >> m[add].Data >> m[add].Next;
		m[add].Address = add;
	}
	int p = head;
	while (p != -1) {
		address.push_back(p);
		p = m[p].Next;
	}
	int cnt = address.size();
	for (int i = 0; i < cnt - cnt % K; i += K) {
		reverse(address.begin() + i, address.begin() + i + K);
	}
	for (int i = 0; i < cnt - 1; i++) {
		printf("%05d %d %05d\n", address[i], m[address[i]].Data, address[i + 1]);
	}
	printf("%05d %d %d\n", address[cnt - 1], m[address[cnt - 1]].Data, -1);
	return 0;
}

猜你喜欢

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