目录
-
- 排序特征
- 结构体排序
-
-
- PAT甲级 1153 Decode Registration Card of PAT (25 分)/PAT 乙级 解码PAT准考证 (25 分)
- PAT甲级 1075 PAT Judge (25 分)
- PAT甲级 1012 The Best Rank (25 分)
- PAT甲级 1141 PAT Ranking of Institutions (25 分)
- PAT甲级 1137 Final Grading (25 分) / PAT乙级 1080 MOOC期终成绩 (25 分)
- PAT甲级 1083 List Grades (25 分)
- PAT甲级 1025 PAT Ranking (25 分)
- PAT甲级 1028 List Sorting (25 分)
-
- 散列函数
-
-
- PAT甲级 1054 The Dominant Color (20 分)
- PAT甲级 1041 Be Unique (20 分)
- PAT甲级 1050 String Subtraction (20 分)
- PAT甲级 1048 Find Coins (25 分)
- PAT甲级 1071 Speech Patterns (25 分)
- PAT甲级 1084 Broken Keyboard (20 分)
- PAT甲级 1116 Come on! Let's C (20 分)
- PAT甲级 1092 To Buy or Not to Buy (20 分)
- PAT甲级 1124 Raffle for Weibo Followers (20 分)
- PAT甲级 1144 The Missing Number (20 分)
- PAT甲级 1039 Course List for Student (25 分)
- PAT甲级 1047 Student List for Course (25 分)
- PAT甲级 1129 Recommendation System (25 分)
- PAT甲级 1022 Digital Library (30 分)
- PAT甲级 1149 Dangerous Goods Packaging (25 分)
- PAT甲级 1078 Hashing (25 分)
- PAT甲级 1145 Hashing - Average Search Time (25 分)
-
- 集合
排序特征
冒泡排序
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;
}