日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PAT甲级题目翻译+答案 AcWing(哈希表)

發布時間:2025/3/19 编程问答 9 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PAT甲级题目翻译+答案 AcWing(哈希表) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1048 Find Coins (25 分)

題意 :

  • 給一序列,要求從中選出兩個值使得它們的和恰好等于m,輸出第一個值字典序最小且升序的方案

思路 :

  • 看似O(n2)O(n^2)O(n2),其實可以一邊輸入一邊操作,就變成O(n)O(n)O(n)
  • 對于當前輸入的這個數x,判斷有沒有恰好y=m-x這個數存在,如果有,就讓它們中小的是v11,大的是v22,如果v11小于v1,那么v1是v11,v2是v22
#include <iostream> #include <unordered_set> using namespace std;int n, m; unordered_set<int> se;int main() {scanf("%d%d", &n, &m);int v1 = 1e9, v2;for (int i = 1, x; i <= n; i ++ ){scanf("%d", &x);int y = m - x;if (se.count(y)){if (x > y) swap(x, y);if (x < v1) v1 = x, v2 = y;}se.insert(x);}if (v1 == 1e9) puts("No Solution");else printf("%d %d\n", v1, v2); }

1063 Set Similarity (25 分)

題意 :

  • 給一堆集合(可能包含相同元素),每次詢問兩個集合,問它們的 分別去重后,公有的個數 / 總共的個數

思路 :

  • 顯然在輸入集合的時候就要去重了

語法 :

  • 在printf中輸出%,用"%%"即可
#include <iostream> #include <unordered_set>using namespace std;const int N = 55;int n; unordered_set<int> S[N];int main() {scanf("%d", &n);for (int i = 1; i <= n; i ++ ){int m;scanf("%d", &m);while (m -- ){int x;scanf("%d", &x);S[i].insert(x);}}int k;scanf("%d", &k);while (k -- ){int a, b;scanf("%d%d", &a, &b);int nc = 0;for (auto x : S[a]) nc += S[b].count(x);int nt = S[a].size() + S[b].size() - nc;printf("%.1lf%%\n", (double)nc / nt * 100);}return 0; }

1078 Hashing (25 分)

題意 :

  • distinct的序列插入到一個哈希表中,然后輸出每個按順序所給的輸入數字的位置
  • 哈希函數定義為key%TSize,TSize為哈希表的最大大小
  • 利用只具有正增量的二次探測法來解決沖突Quadratic probing (with positive increments only) is used to solve the collisions.
  • 注意,哈希表的大小最好是質數,如果用戶給的最大大小不是質數,則必須將表的大小重新定義為大于用戶給出的大小的最小素數
  • 位置索引從0開始;如果無法插入某個數字,則輸出-

思路 :

  • 哈希表一般有兩種算法:拉鏈法和開放尋址法;這道題中是開放尋址法,也就是只具有正增量的二次探測法
  • 開放尋址法,即,先映射,如果這個位置上有數,就順次看后面一個位置;即,看的位置依次是t,t+12,t+22,t+32t,t+1^2,t+2^2,t+3^2t,t+12,t+22,t+32,當然還要%s
  • 開放尋址法,必然用到find
#include <iostream> using namespace std;const int N = 1e4 + 10;int s, n; int h[N];bool is_prime(int x) {if (x == 1) return false;for (int i = 2; i * i <= x; i ++ )if (x % i == 0)return false;return true; }int find(int x) {int t = x % s;for (int k = 0; k < s; k ++ ){int i = (t + k * k) % s;if (!h[i]) return i;}return -1; }int main() {scanf("%d%d", &s, &n);while (!is_prime(s)) s ++ ;int x;for (int i = 0; i < n && scanf("%d", &x); i ++ ){int k = find(x);if (k == -1) printf("-");else{h[k] = x;printf("%d", k);}if (i != n - 1) printf(" ");} }

1120 Friend Numbers (20 分)

  • 思路 :什么數據結構可以讓我們既判重又排序呢?其實不用哈希表而用set會更好,可以少一步排序
  • 語法 :set默認從小到大排序;空格輸出新方法(這題如果不判空格會wa)
#include <iostream> #include <set>using namespace std;int main() {int n;cin >> n;set<int> se;while (n -- ){int x;cin >> x;int s = 0;while (x) s += x % 10, x /= 10;se.insert(s);}cout << se.size() << endl;;bool is_first = true;for (auto x : se){if (is_first) is_first = false;else cout << ' ';cout << x;}return 0; }

1137 Final Grading (25 分)

題意 :

  • 想要獲得一張合格證書,必須首先獲得不少于 200 分的在線編程作業分,然后總評獲得不少于 60 分(滿分 100)。打印出獲得合格證書的學生名單。

思路 :

  • 首先輸入所有的信息,然后遍歷哈希表中每一個結構體,先計算總評,然后如果分數符合獲得合格證書的要求,就將它放入vector,然后對這個vector排序

語法 :

  • stu.calc();
  • Student(): p(-1), m(-1), f(-1), s(0) {}
  • void calc()
  • 四舍五入函數 s = round(m * 0.4 + f * 0.6);
  • round函數在cmath頭文件中
#include <iostream> #include <algorithm> #include <vector> #include <unordered_map> #include <cmath> using namespace std;struct Student {string id;int p, m, f, s;Student() : p(-1), m(-1), f(-1), s(0) {}void calc(){if (m > f) s = round(m * 0.4 + f * 0.6);else s = f;}bool operator< (const Student &t) const{if (s != t.s) return s > t.s;return id < t.id;} };int main() {int P, M, N;scanf("%d%d%d", &P, &M, &N);unordered_map<string, Student> hash;string id;int grade;for (int i = 0; i < P; i ++ ){cin >> id >> grade;hash[id].id = id;hash[id].p = grade;}for (int i = 0; i < M; i ++ ){cin >> id >> grade;hash[id].id = id;hash[id].m = grade;}for (int i = 0; i < N; i ++ ){cin >> id >> grade;hash[id].id = id;hash[id].f = grade;}vector<Student> students;for (auto &item : hash){auto &stu = item.second;stu.calc();if (stu.p >= 200 && stu.s >= 60)students.push_back(stu);}sort(students.begin(), students.end());for (int i = 0; i < students.size(); i ++ ){auto &stu = students[i];cout << stu.id << ' ' << stu.p << ' ' << stu.m << ' ' << stu.f << ' ' << stu.s << endl;} }

1144 The Missing Number (20 分)

  • 思路 :這里用while比用for方便,就是找一個從1開始連續增加的數字
  • 語法 :set的insert和find均為O(logn)O(logn)O(logn),count為O(k+logn)O(k+logn)O(k+logn)
#include <iostream> #include <unordered_set>using namespace std;int main() {int n;cin >> n;unordered_set<int> se;while (n -- ){int x;cin >> x;se.insert(x);}int res = 1;while (se.count(res)) res ++ ;cout << res;return 0; }

1145 Hashing - Average Search Time (25 分)

題意 :

  • 首先將一個由若干個不同正整數構成的整數序列插入到一個哈希表中,然后嘗試從表中查找另一個整數鍵值序列,并輸出平均查找時間(查找時間指查找某個值是否在表中所進行的比較操作的次數)。
  • 利用只具有正增量的二次探測法來解決沖突。
  • 注意,哈希表的大小最好是素數,如果用戶給出的最大大小不是素數,則必須將表大小重新定義為大于用戶給出的大小的最小素數。
  • 注意: 如果查找了 TSize 次,每次查找的位置上均有數,但都不等于要查找的數,則認為查找時間是 TSize+1。
#include <iostream>using namespace std;const int N = 10010;int s, n, m; int h[N];bool is_prime(int x) {if (x == 1) return false;for (int i = 2; i * i <= x; i ++ )if (x % i == 0)return false;return true; }int find(int x, int &cnt) {int t = x % s;cnt = 1;for (int k = 0; k < s; k ++, cnt ++ ){int i = (t + k * k) % s;if (!h[i] || h[i] == x) return i;}return -1; }int main() {cin >> s >> n >> m;while (!is_prime(s)) s ++ ;for (int i = 0; i < n; i ++ ){int x, count;cin >> x;int t = find(x, count);if (t == -1) printf("%d cannot be inserted.\n", x);else h[t] = x;}int cnt = 0;for (int i = 0; i < m; i ++ ){int x, count;cin >> x;find(x, count);cnt += count;}printf("%.1lf\n", (double)cnt / m);return 0; }

1149 Dangerous Goods Packaging (25 分)

題意 :

  • 本題給定一張不相容物品的清單,需要你檢查每一張集裝箱貨品清單,判斷它們是否能裝在同一只箱子里。

思路 :

  • 對于每個詢問,只要檢查每一對關系即可,因此,只需要開兩個數組存儲
#include <iostream> #include <unordered_set> using namespace std;const int N = 1e4 + 10;int n, m; int a[N], b[N];int main() {scanf("%d%d", &n, &m);for (int i = 0; i < n; i ++ ) scanf("%d%d", &a[i], &b[i]);int cnt;while (m -- ){scanf("%d", &cnt);unordered_set<int> se;int x;while (cnt -- ){scanf("%d", &x);se.insert(x);}bool success = true;for (int i = 0; i < n; i ++ )if (se.count(a[i]) && se.count(b[i])){success = false;break;}if (!success) puts("No");else puts("Yes");} }

總結

以上是生活随笔為你收集整理的PAT甲级题目翻译+答案 AcWing(哈希表)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。