【PAT甲级】排序散列集合专题

排序特征

冒泡排序

	for (int i = 0; i < n-1; i++) {
    
    
		for (int j = i; j < n; j++) {
    
    
			if (a[i] > a[j]) swap(a[i], a[j]);
		}
	}

选择排序

	for (int i = 0; i < n-1; i++) {
    
    
		int min = i;
		for (int j = i+1; j < n; j++) {
    
    
			if (a[min] > a[j]) min = j;
		}
		if (min != i) swap(a[min], a[i]);
	}

快速排序

int partition(int a[], int low, int high) {
    
    
	int key = a[low];
	while (low < high) {
    
    
		while (low < high && a[high] >= key) high--;
		a[low] = a[high];
		while (low < high && a[low] <= key) low++;
		a[high] = a[low];
	}
	a[low] = key;
	return low;
}

void quick_sort(int a[], int low, int high) {
    
    
	if (low >= high) return;
	int pos = partition(a, low, high);
	quick_sort(a, low, pos-1);
	quick_sort(a, pos+1, high);
}

插入排序

for(int i = 1; i < N; i++){
    
    
	for(int j = i - 1; j >= 0 && a[j] > a[j + 1]; j--){
    
    
		swap(a[j], a[j + 1]);
	}
}

归并排序

for (int l = 2; l / 2 <= N; l += l) {
    
    	// 间距:小->大
	for (int i = 0; i < N; i += l) {
    
    	// 范围:左->右
		sort(a+i, a+min(i+l,N));
	}
}

PAT甲级 1101 Quick Sort (25 分) / PAT乙级 1045 快速排序 (25 point(s))

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

const int maxn = 10e5+10;
const long long INF = 10e9;
long long a[maxn], leftMax[maxn], rightMin[maxn];
vector<int> pivot;

bool cmp(long long a, long long b) {
    
    
	return a < b;
}

int main() {
    
    
	int n = 0;
	cin >> n;
	
	for (int i = 0; i < n; i++)
		cin >> a[i];
	
	leftMax[0] = 0;                                     // 左侧最大值数组
	for (int i = 1; i < n; i++)
		leftMax[i] = max(leftMax[i-1], a[i-1]);
	
	rightMin[n-1] = INF;                                // 右侧最小值数组
	for (int i = n-2; i >= 0; i--)
		rightMin[i] = min(rightMin[i+1], a[i+1]);
	
	for (int i = 0; i < n; i++) {
    
    
		if (a[i] > leftMax[i] && a[i] < rightMin[i])
			pivot.push_back(a[i]);
	}
	cout << pivot.size() << endl;
	if (pivot.size() == 0) cout << endl;                // n = 0 即输出空行
	
	sort(pivot.begin(), pivot.end(), cmp);
	for (int i = 0; i < pivot.size(); i++) {
    
    
		cout << pivot[i];
		if (i != pivot.size()-1) cout << " ";
	}
	
	return 0;
}

PAT甲级 1089 Insert or Merge (25 分) / PAT乙级

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N = 0;
bool insert_sort(vector<int> a, vector<int> &b) {
    
    
	bool flag = false;
	for (int i = 1; i < N; i++) {
    
                               // 插入排序模板
		for (int j = i-1; j >= 0 && a[j] > a[j+1]; j--) {
    
    
			swap(a[j], a[j+1]);
		}
		if (flag) {
    
     b = a; return true; }
		if (a == b) flag = true;
	}
    return false;
}

bool merge_sort(vector<int> a, vector<int> &b) {
    
    
	bool flag = false;
	for (int l = 2; l/2 <= N; l += l) {
    
                         // 归并排序模板
		for (int i = 0; i < N; i += l) {
    
    
			sort(a.begin()+i, a.begin()+min(i+l, N));
		}
		if (flag) {
    
     b = a; return true; }
		if (a == b) flag = true;
	}
	return false;
}

int main() {
    
    
	cin >> N;
	
	vector<int> a(N), b(N);
	for (int i = 0; i < N; i++)
		cin >> a[i];
	for (int i = 0; i < N; i++)
		cin >> b[i];
	
	if (merge_sort(a,b)) cout << "Merge Sort" << endl;
	else if (insert_sort(a,b)) cout << "Insertion Sort" << endl;

	for (int i = 0; i < b.size(); i++) {
    
    
		cout << b[i];
		if (i != b.size()-1) cout << " ";
	}
	return 0;
}

结构体排序

  • 先存入数据至结构体向量,再根据需要进行分类检索。
  • 设置结构体: 根据输入、排序优先级设置结构体变量
// 多行成绩排序优先级
int grade[], rank[];	
// 字符串编号
int cnt = 0;
unordered_map<string, int> m;
for (int i = 0; i < P; i++) {
    
    
	cin >> string >> int;
	m[string] = cnt++;
	node nod;	nod.string = string;	nod.int = int;
	v.push_back(nod);
}
	
for (int i = 0; i < M; i++) {
    
    
	cin >> string >> int;
	if (m[string] || v[0].string == string) v[m[string]].int = int;
}
  • 序号查询或选择性输出则结构体内变量 flag=false,序号查询则结构体外数组 flag[maxn] = {false}
// 排序编号
sort(v.begin(), v.end(), cmp);    
for (int i = 1; i <= N; i++) {
    
    
	if (i != 1 && v[i].total_score == v[i-1].total_score)
		v[i].rank = v[i-1].rank;
	else 
		v[i].rank = i;
}

PAT甲级 1153 Decode Registration Card of PAT (25 分)/PAT 乙级 解码PAT准考证 (25 分)

#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;

struct node{
    
    
	string id;
	int score;
};

bool cmp(const node &a, const node &b) {
    
    		// non-increasing = decreasing
	return a.score != b.score ? a.score > b.score : a.id < b.id;
}

int main() {
    
    
	int N = 0, M = 0;
	cin >> N >> M;
	
	vector<node> v(N);
	for (int i = 0; i < N; i++)
		cin >> v[i].id>> v[i].score;
	
	string s;
	int num = 0;
	for (int i = 1; i <= M; i++) {
    
    
		cin >> num >> s;
		printf("Case %d: %d %s\n", i, num, s.c_str());
		
		vector<node> ans;
		if (num == 1) {
    
    
			for (int j = 0; j < N; j++) 
				if (s[0] == v[j].id[0]) ans.push_back(v[j]);	// id[0] = test level
		}
		else if (num == 2) {
    
    
			int cnt = 0, sum = 0;
			for (int j = 0; j < N; j++) {
    
    
				if (s == v[j].id.substr(1,3)) {
    
    		// id[1-3] = site number
					sum += v[j].score;
					cnt++;
				}
			}
			if (cnt > 0) ans.push_back({
    
    to_string(cnt), sum});
		} else if (num == 3) {
    
    
            unordered_map<string, int> m;
            for (int j = 0; j < N; j++)				// id[4-6] = test date
            	if (s == v[j].id.substr(4,6)) 	m[v[j].id.substr(1,3)]++;
            for (auto it : m) ans.push_back({
    
    it.first, it.second});
		}
		
		sort(ans.begin(), ans.end(), cmp);
		for (int j = 0; j < ans.size(); j++) 
			printf("%s %d\n", ans[j].id.c_str(), ans[j].score);
		if (num >= 0 && num <= 3 && ans.size() == 0)	cout << "NA" << endl;
	}
	
	return 0;
}

PAT甲级 1075 PAT Judge (25 分)

序号查询结构体内 flag

#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;

struct node {
    
    
	bool flag = false;
	int id, rank, total_score = 0, total_pass = 0;
	int score[6] = {
    
    -1, -1, -1, -1, -1, -1};
};

bool cmp(const node &a, const node &b) {
    
    
	if (a.total_score != b.total_score) return a.total_score > b.total_score;
	else if (a.total_pass != b.total_pass) return a.total_pass > b.total_pass;
	else return a.id < b.id;
}

int main() {
    
    
	int N = 0, K=0, M = 0;
	cin >> N >> K >>  M;

	vector<int> full(K+1);
	for (int i = 1; i <= K; i++) 
		cin >> full[i];

	vector<node> v(N+1);
	int id = 0, num = 0, score = 0;
	for (int i = 1; i <= M; i++) {
    
    
		cin >> id >> num >> score;
		if (score != -1) v[id].flag = true;                                 // 边界条件
        
		v[id].id = id;
		v[id].score[num] = max(v[id].score[num], score);
		if (v[id].score[num] == -1) v[id].score[num] = 0;                   // 编译未通过, 得分为 0
	}
	for (int i = 1; i <= N; i++) {
    
    
		for (int j = 1; j <= K; j++) {
    
    
			if (v[i].score[j] > 0) v[i].total_score += v[i].score[j];
			if (v[i].score[j] == full[j]) v[i].total_pass++;
		}
	}
    
	sort(v.begin()+1, v.end(), cmp);                                        // 排序编号
	for (int i = 1; i <= N; i++) {
    
                                             
		if (i != 1 && v[i].total_score == v[i-1].total_score)
			v[i].rank = v[i-1].rank;
		else 
			v[i].rank = i;
	}
	
	for (int i = 1; i <= N; i++) {
    
    
		if (!v[i].flag) continue;                                           // 边界条件
		
		printf("%d %05d %d ", v[i].rank, v[i].id, v[i].total_score);
		for (int j = 1; j <= K; j++) {
    
    
			if (v[i].score[j] == -1) printf("-");
			else printf("%d", v[i].score[j]);
			if (j != K) printf(" ");
		}
		printf("\n");
	}

	return 0;
}

PAT甲级 1012 The Best Rank (25 分)

多行成绩排序优先级

int grade[], rank[];	

int priority;
bool cmp(const node &a, const node &b) {
    
    
	return a.grade[priority] > b.grade[priority];
}

序号查询则结构体外数组 flag[maxn] = {false}

#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;

struct node {
    
    
	int id, grade[4], rank[4], best;
};
const int maxn = 10e7+10;
bool flag[maxn] = {
    
    false};

int priority;
bool cmp(const node &a, const node &b) {
    
    			// a->c->m->e 优先级降序 
	return a.grade[priority] > b.grade[priority];
}

int main() {
    
    
	int N = 0, M = 0;
	cin >> N >> M;
	
	vector<node> v(N);
	int id = 0, c = 0, m = 0, e = 0;
	for (int i = 0; i < N; i++) {
    
    
		cin >> id >> c >> m >> e;
		int a = (c + m + e) / 3;
		v[i].id = id;	
		v[i].grade[0] = a;	v[i].grade[1] = c;	
		v[i].grade[2] = m;	v[i].grade[3] = e;
	}
	for (int i = 0; i < N; i++) 						// 查询序号映射表 
		flag[v[i].id] = true;
	
	for (int j = 0; j < 4; j++) {
    
    						// 列优先标记当前行排名 
		priority = j;
		sort(v.begin(), v.end(), cmp);					// 排序编号
		for (int i = 0; i < N; i++) {
    
    
			if (i != 0 && v[i].grade[j] == v[i-1].grade[j])
				v[i].rank[j] = v[i-1].rank[j];
			else
				v[i].rank[j] = i+1;
		}
	}
	
	for (int i = 0; i < N; i++) {
    
    						// 行优先选择当前列最佳排名 
		v[i].best = 0;
		int minn = v[i].rank[0];						// 搜索最大值
		for (int j = 1; j < 4; j++) {
    
    
			if (minn > v[i].rank[j]) {
    
    
				minn = v[i].rank[j];
				v[i].best = j;
			}
		}
	}
	
	char dic[4] = {
    
    'A', 'C', 'M', 'E'};		// 字典 
	for (int i = 0; i < M; i++) {
    
    
		cin >> id;
		if (!flag[id]) printf("N/A\n");
		else {
    
    
			for (int j = 0; j < N; j++) {
    
    
				if (v[j].id == id) {
    
    
					int order = v[j].best; 
					printf("%d %c\n", v[j].rank[order], dic[order);
					break; 
				}
			}
		}
	}
	return 0;
}

PAT甲级 1141 PAT Ranking of Institutions (25 分)

字符串编号

#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;

struct node {
    
    
	string school;
	int rank, score, cnt;
};

bool cmp(const node &a, const node &b) {
    
    
	if (a.score != b.score) return a.score > b.score;
	else if (a.cnt != b.cnt) return a.cnt < b.cnt;
	else return a.school < b.school;
}

unordered_map<string, double> tws;              // 学校名称-分数
unordered_map<string, int> ns;                  // 学校名称-次数
vector<node> v;

int main() {
    
    
	int N = 0;
	cin >> N;
	
	string s, school;
	double score = 0.0;
	for (int i = 0; i < N; i++) {
    
    
		cin >> s >> score >> school;
		if (s[0] == 'T') score = score*1.5;             // 计算时double, 最终结果int
		else if (s[0] == 'B') score = score/1.5;
		
 		for (int j = 0; j < school.size(); j++)         // 学校名称小写化
			school[j] = tolower(school[j]);
                         
		tws[school]+=score;                             // 字符串编号
		ns[school]++;                                   
	}
	
	for (auto it : tws) {
    
    
		node nod;	
		nod.school = it.first;	
		nod.score = int(it.second);
		nod.cnt = ns[it.first];	
	
		v.push_back(nod);
	}
	
	sort(v.begin(), v.end(), cmp);                              // 排序编号
	for (int i = 0; i < v.size(); i++) {
    
    
		if (i != 0 && v[i].score == v[i-1].score)
			v[i].rank = v[i-1].rank;
		else 
			v[i].rank = i+1;
	}
	
	printf("%d\n", v.size());
	for (int i = 0; i < v.size(); i++) 
		printf("%d %s %d %d\n", v[i].rank, v[i].school.c_str(), v[i].score, v[i].cnt);
	return 0;
}

PAT甲级 1137 Final Grading (25 分) / PAT乙级 1080 MOOC期终成绩 (25 分)

字符串编号

#include <iostream>
#include <vector>
#include <unordered_map>
#include <cmath>
#include <algorithm>
using namespace std;

struct node {
    
    
	string name;
	int gp = -1, gm = -1, gf = -1, g = 0;
};

bool cmp(const node &a, const node &b) {
    
    
    return a.g != b.g ? a.g > b.g : a.name < b.name;
}

int cnt = 0;
unordered_map<string, int> m;
vector<node> v;

int main() {
    
    
	int P = 0, M = 0, N = 0;
	cin >> P >> M >> N;
	
	string name;
	double score = 0.0;
	for (int i = 0; i < P; i++) {
    
                   
		cin >> name >> score;
		if (score >= 200) {
    
    
			m[name] = cnt++;                                    // 字符串编号
			node nod;	nod.name = name;	nod.gp = score;
			v.push_back(nod);
		}
	}
	for (int i = 0; i < M; i++) {
    
    
		cin >> name >> score;
		if (m[name] || v[0].name == name) v[m[name]].gm = score;
	}
	for (int i = 0; i < N; i++) {
    
    
		cin >> name >> score;
		if (m[name] || v[0].name == name) v[m[name]].gf = score;
	}
    for(int i=0; i < v.size(); i++){
    
    
        v[i].g=(v[i].gm > v[i].gf) ? round(v[i].gf*0.6 + v[i].gm*0.4) : v[i].gf;
    }
	
	sort(v.begin(),v.end(),cmp);
	for (int i = 0; i < v.size(); i++) {
    
    
		if (v[i].g >= 60) printf("%s %d %d %d %d\n", v[i].name.c_str(), v[i].gp, v[i].gm, v[i].gf, v[i].g);
	}
	
	return 0;
}

PAT甲级 1083 List Grades (25 分)

选择性输出结构体内 flag

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

struct node{
    
    
	string name, id;
	int score;
	bool flag = false;
};

bool cmp(const node &a, const node &b) {
    
    
	return a.score > b.score;
}

int main() {
    
    
	int N = 0;
	cin >> N;
	
	vector<node> v(N);
	for (int i = 0; i < N; i++) 
		cin >> v[i].name >> v[i].id >> v[i].score;
	
	int low = 0, high = 0;
	cin >> low >> high;
	
	int cnt = 0;
	for (int i = 0; i < v.size(); i++) {
    
    
		if (v[i].score >= low && v[i].score <= high) {
    
    
			v[i].flag = true;
			cnt++;
		}
	}
	if (cnt == 0) printf("NONE\n");
	
	sort(v.begin(), v.end(), cmp);
	for (int i = 0; i < v.size(); i++) {
    
    
		if (v[i].flag)	printf("%s %s\n", v[i].name.c_str(), v[i].id.c_str());
	}
	
	return 0;
}

PAT甲级 1025 PAT Ranking (25 分)

排序编号

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

struct node {
    
    
	string id;
	int score, num, final_rank, local_rank;
};

bool cmp(const node &a, const node &b) {
    
    
	return a.score != b.score ? a.score > b.score : a.id < b.id; 
}

int main() {
    
    
	int N = 0, K = 0;
	cin >> N;
	
	vector<node> v;
	for (int i = 0; i < N; i++) {
    
    
		cin >> K;
		
        node nod;
		vector<node> temp;
		for (int j = 0; j < K; j++) {
    
    
			cin >> nod.id >> nod.score;
			nod.num = i+1;
			temp.push_back(nod);
		}
        
		sort(temp.begin(), temp.end(), cmp);                    // 排序编号local_rank
		for (int j = 0; j < K; j++) {
    
    
			if (j != 0 && temp[j].score == temp[j-1].score)
				temp[j].local_rank = temp[j-1].local_rank;
			else 
				temp[j].local_rank = j+1;
		}
		
		v.insert(v.end(), temp.begin(), temp.end());
	}
	sort(v.begin(), v.end(), cmp);                              // 排序编号final_rank
	for (int i = 0; i <= v.size(); i++) {
    
    
		if (i != 0 && v[i].score == v[i-1].score)
			v[i].final_rank = v[i-1].final_rank;
		else 
			v[i].final_rank = i+1;
	}
		
	printf("%d\n", v.size());
	for (int i = 0; i < v.size(); i++) {
    
    
		printf("%s %d %d %d\n", v[i].id.c_str(), v[i].final_rank, v[i].num, v[i].local_rank);
	}


	return 0;
}

PAT甲级 1028 List Sorting (25 分)

按列排序

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

struct node {
    
    
	string id, name;
	int score;
};

int num = 0;
bool cmp(const node &a, const node &b) {
    
    
	if (num == 1) return a.id < b.id;
	else if (num == 2) return a.name != b.name ? a.name < b.name : a.id < b.id;
	else return a.score != b.score ? a.score < b.score : a.id < b.id;
}

int main() {
    
    
	int n = 0;
	cin >> n >> num;
	
	vector<node> v(n);
	for (int i = 0; i < v.size(); i++)
		cin >> v[i].id >> v[i].name >> v[i].score;
	sort(v.begin(),v.end(),cmp);
	for (int i =0; i < v.size(); i++)
		printf("%s %s %d\n", v[i].id.c_str(), v[i].name.c_str(), v[i].score);
    
	return 0;
}

散列函数

(1) 直接定址法
恒等变换:H(key) = key
线性变换:H(key) = a * key + b

(2) 除留余数法
H(key) = key % Tsize (表长Tsize >= mod,否则会越界)

解决冲突:H(key) = (H(key) + F(i) ) % size
线性探测 F(i) = i 平方探测 F(i) = i*i,其中 i 为冲突次数

// 素数表长
bool isprime(int n) {
    
    
	if (n < 2) return false;
	int limit = int(sqrt(n*1.0));
	for (int i = 2; i <= limit; i++)
		if (n % i == 0) return false;
	return true;
}
while (!isprime(size)) size++;
// 线性探测 H(key) = (key + i) % size
// 平方探测 H(key) = (key + i*i ) % size
bool insert(int key) {
    
    
	for (int i = 0; i <= size; i++) {
    
    
		int index = (key + i*i) % size;
		if (hashtable[index] == 0) {
    
    
			hashtable[index] = key;
			return true;
		}
	}
	return false;
}
// 平均查找长度
int asl = 0;
int search_key(int key) {
    
    
	for (int i = 0; i <= size; i++) {
    
    
		asl++;
		int index = (key + i*i) %size;
		if (hashtable[index] == key || hashtable[index] == 0) 
			break;
	}
	return asl;
}

PAT甲级 1054 The Dominant Color (20 分)

#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;

struct node{
    
    
	int id, cnt;
};

bool cmp(const node &a, const node &b) {
    
    
	return a.cnt > b.cnt;
}
int main() {
    
    
	int N = 0, M = 0;
	cin >> N >> M;
	
	int num = 0;
	unordered_map<int, int> m;	
	for (int i = 0; i < N; i++)	{
    
    
		for (int j = 0; j < M; j++) {
    
    
			scanf("%d", &num);
			m[num]++;
		}
	}
	
	vector<node> v;     
	for (auto it : m) {
    
    
		v.push_back({
    
    it.first, it.second});
	}
	sort(v.begin(),v.end(),cmp);
	printf("%d\n", v[0].id);

 	return 0;
}

PAT甲级 1041 Be Unique (20 分)

#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;

int main() {
    
    
	int n = 0;
	cin >> n;

	int num = 0;
	vector<int> v;
	unordered_map<int, int> m;
	for (int i = 0; i < n; i++) {
    
    
		cin >> num;
		v.push_back(num);				// 	第一个unique数,需要线性存储
		m[num]++;
	}
	
	bool flag = false;
	int result = 0;
	for (int i = 0; i < v.size(); i++) {
    
    
		if (m[v[i]] == 1) {
    
    
			result = v[i];
			flag = true;
			break;
		}
	}
	
	if (flag) cout << result << endl;
	else cout << "None" << endl;
		
	return 0;
}

PAT甲级 1050 String Subtraction (20 分)

  • getline()的结束符不放入缓存区
getline(cin, s1);	getline(cin, s2);
  • cin的结束符结束符还在缓存区;
cin >> s1;	getchar();	getline(cin,s);
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;

int main() {
    
    
	string s1, s2;
	getline(cin, s1);	
	getline(cin, s2);
	
	unordered_map<char,bool> m;
	for (int i = 0; i < s2.size(); i++)
		m[s2[i]] = true;
	for (int i = 0; i < s1.size(); i++)
		if (!m[s1[i]]) cout << s1[i];
	cout << endl;
		
	return 0;
}

PAT甲级 1048 Find Coins (25 分)

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;

int main() {
    
    
	int n = 0, sum = 0;
	cin >> n >> sum;
	
	int num = 0;
	map<int, int> m;
	for (int i = 0; i < n; i++) {
    
    
		cin >> num;
		m[num]++;
	}
	
	for (auto it : m) {
    
    
        int i = it.first;
		if (m[i]) {
    
    
			m[i]--;
            if (m[sum-i]) {
    
    
			    cout << i << " " << sum-i << endl;
			    return 0;
		    }
			m[i]++; 
		 }
	}
	cout << "No Solution" << endl;	
		
	return 0;
}

PAT甲级 1071 Speech Patterns (25 分)

#include <iostream>
#include <cstdlib>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;

struct node{
    
    
	string word;
	int cnt;
};

bool cmp(const node &a, const node &b) {
    
    
	return a.cnt != b.cnt ? a.cnt > b.cnt : a.word < b.word;
}

int main() {
    
    

	string s;
	getline(cin, s);
	
	unordered_map<string,int> m;
	for (int i = 0; i < s.size(); i++) {
    
    
		if (!isalnum(s[i])) continue;

		int j = i;
		while (isalnum(s[j])) {
    
    
            s[j] = tolower(s[j]);
            j++;
        }
		string word = s.substr(i, j-i);
		m[word]++;
        i = j;
	}
	
	vector<node> v;	
	for (auto it : m) {
    
    
		v.push_back({
    
    it.first, it.second});
	}
	sort(v.begin(), v.end(), cmp);
	if (v.size() > 0) cout << v[0].word << " " << v[0].cnt << endl;
	
 	return 0;
}

PAT甲级 1084 Broken Keyboard (20 分)

#include <iostream>
#include <unordered_map>
#include <cstdlib>
#include <algorithm>
using namespace std;

int main() {
    
    
	string s, table;
	cin >> s >> table;
	
	unordered_map<char, bool> m;
	for (int i = 0; i < table.size(); i++) {
    
                // 未损坏键位
		if (isalpha(table[i]) && islower(table[i])) table[i] = toupper(table[i]);
		m[table[i]] = true;                                                         
	}

	
	for (int i = 0; i < s.size(); i++) {
    
                    // 检查输入键位
		if (isalpha(s[i]) && islower(s[i])) s[i] = toupper(s[i]);
		if (!m[s[i]]) {
    
    
			m[s[i]] = true;                             
        	cout << s[i];
		}
	}		
	return 0;
}

PAT甲级 1116 Come on! Let’s C (20 分)

#include <iostream>
#include <map>
#include <cmath>
using namespace std;

map<string, bool> flag;
map<string, int> order;

bool IsPrime(int n) {
    
    
	if (n < 2) return false;
	
	int limit = int(sqrt(n*1.0));
	for (int i = 2; i <= limit; i++)
		if (n % i == 0) return false;
	return true;
}

int main() {
    
    
    int n = 0;
	cin >> n;
	
	string s;
    for (int i = 1; i <= n; i++) {
    
    
        cin >> s;
        order[s] = i;
	}
    
    int k = 0;
	cin >> k;
	
	string id;
    for (int i = 0; i < k; i++) {
    
    
        cin >> id;
        cout << id << ": ";
        
        if (order[id]) {
    
    
            if (flag[id]) printf("Checked\n");
            else if (order[id] == 1) printf("Mystery Award\n");
            else if (IsPrime(order[id])) printf("Minion\n");
            else printf("Chocolate\n");
            flag[id] = true;
        }
		else  printf("Are you kidding?\n");
    }
    
    return 0;
}

PAT甲级 1092 To Buy or Not to Buy (20 分)

#include <iostream>
#include <unordered_map>
#include <algorithm>
using namespace std;

int main() {
    
    
	string a, b;
	cin >> a >> b;
	
	unordered_map<char, int> m;
	for (int i = 0; i < a.size(); i++)	
		m[a[i]]++;
	
	int cnt = 0;
	for (int i = 0; i < b.size(); i++) {
    
    
		m[b[i]]--;
		if (m[b[i]] < 0) cnt++;
	}
	
	if (cnt > 0) cout << "No " << cnt << endl;
	else cout << "Yes " << a.size() - b.size() << endl;

	return 0;
}

PAT甲级 1124 Raffle for Weibo Followers (20 分)

#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;

unordered_map<string,bool> check;
vector<string> v;
 
int main() {
    
    
	int m = 0, n = 0, s = 0;
	cin >> m >> n >> s;
	
	string name;
	for (int i = 0; i < m; i++) {
    
    
		cin >> name;
		v.push_back(name);
	}
	
	if (s > m) cout << "Keep going..." << endl;
	else {
    
    
		for (int i = s-1; i < v.size(); i += n) {
    
    
			while (check[v[i]]) i++;
			check[v[i]] = true;
			cout << v[i] << endl;
		}
	}
	
 	return 0;
}

PAT甲级 1144 The Missing Number (20 分)

#include <iostream>
#include <unordered_map>
#include <algorithm>
using namespace std;

unordered_map<int,bool> m;
int main() {
    
    
	int n = 0;
	cin >> n;
	
	int num = 0;
	for (int i = 0; i < n; i++) {
    
    
		cin >> num;
		m[num] = true;
	}
	
	for (int i = 1; i <= n+1; i++) {
    
                // 如果输入占满区间[1,n], 需要输出 n+1
		if (!m[i]) {
    
    
			printf("%d\n", i);	break;
		}
	}
	
 	return 0;
}

PAT甲级 1039 Course List for Student (25 分)

#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;

bool cmp(int a, int b) {
    
    
	return a < b;
}
unordered_map<string, vector<int>> m;       // m[name].push_back(id);
int main() {
    
    
	int N = 0, K = 0;
	cin >> N >> K;
	
	int id, num;
	string name;
	for (int i = 0;  i < K; i++) {
    
    
		cin >> id >> num;
		for (int j = 0; j < num; j++) {
    
    
			cin >> name;
			m[name].push_back(id);
		}
	} 
	
	for (int i = 0; i < N; i++) {
    
    
		cin >> name;
		
		if (m.count(name) == 0) {
    
    
			printf("%s 0\n", name.c_str());
			continue;
		}
		
		int len = m[name].size();
		printf("%s %d", name.c_str(), len);
		sort(m[name].begin(), m[name].end(), cmp);
		for (int j = 0; j < len; j++) {
    
    
			printf(" %d", m[name][j]);
		}
		printf("\n");
	}
	
	return 0;
}

PAT甲级 1047 Student List for Course (25 分)

#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;

bool cmp(string a, string b) {
    
    
	return a < b;
}

vector<string> v[2510];
int main() {
    
    
	int N = 0, K = 0;
	cin >> N >> K;
	
	string name;
	int num, id;
	for (int i = 0; i < N; i++) {
    
    
		cin >> name >> num;
		for (int j = 0; j < num; j++) {
    
    
			cin >> id;
			v[id].push_back(name);
		}
	} 
	
	for (int i = 1; i <= K; i++) {
    
    
		sort(v[i].begin(), v[i].end(),cmp);
		printf("%d %d\n", i, (int)v[i].size());
		for (int j = 0; j < v[i].size(); j++)
			printf("%s\n", v[i][j].c_str());
	}
	
	return 0;
}

PAT甲级 1129 Recommendation System (25 分)

// 样例3和样例4超时
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;

struct node{
    
    
	int id, cnt;
};
unordered_map<int,int> m;

bool cmp(node a, node b) {
    
    
	return a.cnt != b.cnt ? a.cnt > b.cnt : a.id < b.id;
}
vector<node> v;
int main() {
    
    

	int n = 0, k = 0, num = 0;
	cin >> n >> k;
	
	for (int i = 0; i < n; i++) {
    
    
		cin >> num;	
        if (i != 0) {
    
    
	        printf("%d:", num);                                         
		    for (int j = 0; j < v.size() && j < k; j++) {
    
    
		    	printf(" %d", v[j].id);
		    }
            printf("\n");
            v.clear();
        }
        
        m[num]++;
        for (auto it : m) {
    
                                 // 存储上一轮的所有数据
			v.push_back({
    
    it.first, m[it.first]});	
		}	
		sort(v.begin(), v.end(),cmp);
	}
	
 	return 0;
}
#include <iostream>
#include <set>
#include <unordered_map>
#include <algorithm>
using namespace std;

struct node{
    
    
	int id, cnt;
	node(int a, int b) : id(a), cnt(b){
    
    }
	bool operator < (const node &a) const {
    
    
		return (cnt != a.cnt) ? cnt > a.cnt : id < a.id;
	}
};
unordered_map<int,int> m;
set<node> s;
int main() {
    
    
	int n = 0, k = 0, num = 0;
	cin >> n >> k;

	for (int i = 0; i < n; i++) {
    
    
		cin >> num;	
		if (i != 0) {
    
    
	    	printf("%d:", num); 
			int tempCnt = 0;                                        
			for (auto it = s.begin(); tempCnt < k && it != s.end(); ++it) {
    
    
				printf(" %d", it->id);
				tempCnt++;
			}
        	printf("\n");
		}
		
		auto it = s.find(node(num,m[num]));
		if (it != s.end()) s.erase(it);
		m[num]++;
		s.insert(node(num,m[num]));
	}
	
 	return 0;
}

PAT甲级 1022 Digital Library (30 分)

// 常规思路:结构体存储图书信息,按照类别检索,偶尔超时
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;

struct node{
    
    
	string id, title, author,publisher, year;
	vector<string> keyword;
};

int main() {
    
    
	int n = 0;
	cin >> n;
	
	string word;
	vector<node> v(n);
	for (int i = 0; i < n; i++) {
    
    
		cin >> v[i].id;	getchar();
		getline(cin, v[i].title); 
		getline(cin, v[i].author); 
		while (cin >> word) {
    
    
			v[i].keyword.push_back(word);
			if (getchar() == '\n') break;
		}
		getline(cin, v[i].publisher); 
		cin >> v[i].year;
	}
	
	int m = 0;
	cin >> m;	getchar();
	
	string s;
	for (int i = 0; i < m; i++) {
    
    
		getline(cin, s);
		printf("%s\n", s.c_str());
		char choice = s[0]-'0';
		string key = s.substr(3);

		vector<string> ans;
		if (choice == 1) {
    
    
			for (auto it : v) {
    
    
				if (it.title == key) ans.push_back(it.id);
			}
		}
		else if (choice == 2) {
    
    
			for (auto it : v) {
    
    
				if (it.author == key) ans.push_back(it.id);
			}	
		}
		else if (choice == 3) {
    
    
			for (auto it : v) {
    
    
				for (auto iter = it.keyword.begin(); iter != it.keyword.end(); iter++) {
    
    
					if (*iter == key) ans.push_back(it.id);
				}
			}
		}
		else if (choice == 4) {
    
    
			for (auto it : v) {
    
    
				if (it.publisher == key) ans.push_back(it.id);
			}
		}
		else if (choice == 5) {
    
    
			for (auto it : v) {
    
    
				if (it.year == key) ans.push_back(it.id);
			}
		}
		
		if (ans.size() == 0) printf("Not Found\n");
        sort(ans.begin(), ans.end());
		for (auto it = ans.begin(); it != ans.end(); ++it) {
    
    
			printf("%s\n", (*it).c_str());
		}
	}

 	return 0;
}

PAT甲级 1149 Dangerous Goods Packaging (25 分)

// 样例3超时
#include <iostream>
#include <set>
#include <unordered_map>
#include <vector>
using namespace std;

unordered_map<int, set<int>> mp;
int main() {
    
    
	int n = 0, m = 0, a = 0, b =0;
    cin >> n >> m;
    for(int i = 0; i < n; i++) {
    
    
        cin >> a >> b;
        mp[a].insert(b);
        mp[b].insert(a);
    }

	int num = 0;    
    while (m--) {
    
    
		cin >> num;

		vector<int> v(num);
		for (int i = 0; i < num; i++) 
			cin >> v[i];
		
		bool flag = false;
        for (int i = 0; i < v.size(); i++) {
    
    
            for (int j = 0; j < v.size(); j++) {
    
    
            	if (i == j) continue;
            	if (mp[v[i]].find(v[j]) != mp[v[i]].end()) {
    
    
            		flag = true; break;	
				}
			}
			if (flag) break;
        }
        if (flag) cout << "No" <<endl;
        else cout << "Yes" << endl;
    }

 	return 0;
}
// 打表occur[] 减少循环重数
#include <iostream>
#include <vector>
#include <unordered_map>
#include <vector>
using namespace std;

unordered_map<int, vector<int>> mp;
int main() {
    
    
	int n = 0, m = 0, a = 0, b =0;
    cin >> n >> m;
    for(int i = 0; i < n; i++) {
    
    
        cin >> a >> b;
        mp[a].push_back(b);
        mp[b].push_back(a);
    }

	int num = 0;    
    while (m--) {
    
    
		cin >> num;

		vector<int> v(num);
		vector<bool> occur(100010);
		for (int i = 0; i < num; i++) {
    
    
			cin >> v[i];
			occur[v[i]] = true;
		}
		
		bool flag = false;
        for (int i = 0; i < v.size(); i++) {
    
    
            for (int j = 0; j < mp[v[i]].size(); j++) {
    
    
            	if (occur[ mp[ v[i] ][j] ]) {
    
    
            		flag = true; break;	
				}
			}
			if (flag) break;
        }
        if (flag) cout << "No" <<endl;
        else cout << "Yes" << endl;
    }

 	return 0;
}

PAT甲级 1078 Hashing (25 分)

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;

int size, n, hashtable[10010] = {
    
    0};

bool isprime(int n) {
    
    
	if (n < 2) return false;
	int limit = int(sqrt(n*1.0));
	for (int i = 2; i <= limit; i++)
		if (n % i == 0) return false;
	return true;
}

bool insert(int key) {
    
    
	for (int i = 0; i <= size; i++) {
    
    
		int index = (key + i*i) % size;
		if (hashtable[index] == 0) {
    
    
			hashtable[index] = key;
			cout << index;
			return true;
		}
	}
	cout << "-";
	return false;
}

int main() {
    
    
	cin >> size >> n;
	while (!isprime(size)) size++;
	for (int i = 0; i < n; i++) {
    
    
		int key;
		cin >> key;
		insert(key);
		if (i != n-1) cout << " ";
	}
		
	return 0;
}

PAT甲级 1145 Hashing - Average Search Time (25 分)

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;

int size, n, m, asl = 0;
int hashtable[10010] = {
    
    0};

bool isprime(int n) {
    
    
	if (n < 2) return false;
	int limit = int(sqrt(n*1.0));
	for (int i = 2; i <= limit; i++)
		if (n % i == 0) return false;
	return true;
}

bool insert(int key) {
    
    
	for (int i = 0; i <= size; i++) {
    
    
		int index = (key + i*i) % size;
		if (hashtable[index] == 0) {
    
    
			hashtable[index] = key;
			return true;
		}
	}
	return false;
}

int search_key(int key) {
    
    
	for (int i = 0; i <= size; i++) {
    
    
		asl++;
		int index = (key + i*i) %size;
		if (hashtable[index] == key || hashtable[index] == 0) 
			break;
	}
	return asl;
}

int main() {
    
    
	cin >> size >> n >> m;
	while (!isprime(size)) size++;
	
	int key;
	for (int i = 0; i < n; i++) {
    
    
		cin >> key;
		if (!insert(key)) printf("%d cannot be inserted.\n", key);
	}
 
    for (int i = 0; i < m; i++) {
    
    
    	cin >> key;
    	search_key(key);
    }
    printf("%.1f\n", asl*1.0 / m);

	return 0;
}

集合

无序集合 unordered_set 比有序集合 set 效率高,所以默认使用 unordered_set 存储,然后转存 vector 并重新排序 sort

PAT甲级 1063 Set Similarity (25 分)

#include <iostream>
#include <unordered_set>
#include <algorithm>
using namespace std;

unordered_set<int> iset[55];

int main() {
    
    
	int n = 0, m = 0;
	cin >> n;
	for (int i  = 1; i <= n; i++) {
    
    
		cin >> m;
		for (int j = 0; j < m; j++) {
    
    
			int num;
			cin >> num;
			iset[i].insert(num);
		}
	}
	
	int k = 0;
	cin >> k;
	
	int x = 0, y = 0;
	for (int i = 0; i < k; i++) {
    
    
		cin >> x >> y;
		
		int nc = 0, nt = iset[y].size();			// nt 初始为第二个集合的大小
		for (auto it = iset[x].begin(); it != iset[x].end(); ++it) {
    
    
			if (iset[y].find(*it) != iset[y].end()) nc++;
			else nt++;								// 第一个集合独有的元素
		}
		printf("%.1f%%\n", nc*100.0 / nt);
	}
 	return 0;
}

PAT甲级 1120 Friend Numbers (20 分)

#include <iostream>
#include <vector>
#include <unordered_set>
#include <algorithm>
using namespace std;

unordered_set<int> iset;
bool cmp(int a, int b) {
    
    
	return a < b;
}
int main() {
    
    
	int n = 0;
	cin >> n;
	
	string s;
	for (int i = 0; i < n; i++) {
    
    
		cin >> s;
		int sum = 0;
		for (int j = 0; j < s.size(); j++) 
			sum += s[j] - '0';
		 iset.insert(sum);
	}
	
	vector<int> v;
	for (auto it = iset.begin(); it != iset.end(); ++it) {
    
    
		v.push_back(*it);
	}
	
	sort(v.begin(), v.end(),cmp);
	cout << v.size() << endl;
	for (int i = 0; i < v.size(); i++) {
    
    
		cout << v[i];
		if (i != v.size()-1) cout << " ";
	}

 	return 0;
}

PAT甲级 1121 Damn Single (25 分)

#include <iostream>
#include <vector>
#include <unordered_set>
#include <unordered_map>
#include <algorithm>
using namespace std;

unordered_set<string> sset;
unordered_map<string,string> mm;
vector<string> v;
bool cmp(string a, string b) {
    
    
	return a < b;
}
int main() {
    
    
	string a, b, s;
	int n = 0, m = 0;
    
	cin >> n;
	for (int i = 0; i < n; i++) {
    
    
		cin >> a >> b;
		mm[a] = b;	mm[b] = a;          // 配偶映射
	}
	
	cin >> m;
	for (int i = 0; i < m; i++) {
    
    
		cin >> s;
		sset.insert(s);                 // 聚会人员集合
	}

	for (auto it = sset.begin(); it != sset.end(); ++it) {
    
    
		if ( mm.find(*it) == mm.end() || sset.find(mm[*it]) == sset.end() ) // 没有配偶 或者 配偶没在聚会上
			v.push_back(*it);
	}
	sort(v.begin(), v.end(), cmp);
	cout << v.size() << endl;
	for (int i = 0; i < v.size(); i++) {
    
    
		cout << v[i];
		if (i != v.size()-1) cout << " ";
	}
	
 	return 0;
}

猜你喜欢

转载自blog.csdn.net/K_Xin/article/details/114180252