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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

PAT甲级题目翻译+答案 AcWing(基础算法与数据结构)

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

1029 Median (25 分)

題意 :

  • median中位數
  • 給兩個升序的序列,要求它們兩個合并后的中位數

思路 :

  • 雙指針

語法 :

  • long int
#include <iostream> using namespace std;const int N = 2e5 + 10;int n, m; int a[N], b[N], c[N * 2];int main() {scanf("%d", &n);for (int i = 0; i < n && scanf("%d", &a[i]); i ++ );scanf("%d", &m);for (int i = 0; i < m && scanf("%d", &b[i]); i ++ );int k = 0, i = 0, j = 0;while (i < n && j < m){if (a[i] < b[j]) c[k ++ ] = a[i ++ ];else c[k ++ ] = b[j ++ ];}while (i < n) c[k ++ ] = a[i ++ ];while (j < m) c[k ++ ] = b[j ++ ];cout << c[(n + m - 1) / 2]; }

1040 Longest Symmetric String (25 分)

題意 :

  • 給一字符串(1000),求最長回文子串的長度

思路 :

  • 利用雙指針算法,每次枚舉奇數回文子串的中間以及偶數回文子串偏左的中間,將一個O(n3)O(n^3)O(n3)轉換成O(n2)O(n^2)O(n2)
  • 要注意退出while循環的時候,是不滿足while循環條件的
#include <iostream> using namespace std;int main() {string s;getline(cin, s);int res = 0;for (int i = 0; i < s.size(); i ++ ){int l = i - 1, r = i + 1;while (i >= 0 && r < s.size() && s[l] == s[r]) l -- , r ++ ;res = max(res, r - 1 - (l + 1) + 1);l = i, r = i + 1;while (i >= 0 && r < s.size() && s[l] == s[r]) l -- , r ++ ;res = max(res, r - 1 - (l + 1) + 1);}cout << res << endl; }

1044 Shopping in Mars (25 分)

題意 :

  • 給一個序列(所有值大于0)和一個值m,求輸出區間和等于m的所有方案,如果不存在,則輸出區間和大于m中,差值最小的所有方案;按字典序輸出

思路 :

  • 由于保證所有值大于0,因此對于一個i,不可能有多個j。所以這題只要按照i遞增的順序輸出即可
  • 我們首先確認大于等于m中最小的能湊到多少,即,枚舉所有區間,判斷哪個區間和是大于等于m的最小值;枚舉區間時可以枚舉區間的右端點
  • 發現對于每個區間右端點i,都有一個唯一確定的左端點j,使得區間和是大于等于m中最小的;如果要枚舉兩個端點,復雜度是O(n2)O(n^2)O(n2);但我們發現,這是一個單調的過程,i往后移動時,j一定也往后移動;這樣可以保證兩個端點都是從前往后走,保證兩個端點不會重復走,即保證時間復雜度O(n)O(n)O(n)
  • 以上我們對每個右端點i找到一個相應成為區間最小值的左端點j
  • 接下來再枚舉一遍,對于每個右端點i,有哪個i是能取到最后的最小值的,所有能取到的輸出
  • 且不需要擔心由于枚舉的是右端點,而影響按字典序輸出這回事,因為單調性,這里按右端點排序相當于按左端點排序,不會出現兩個答案區間包含關系
#include <iostream> #include <algorithm> using namespace std;const int N = 1e5 + 10, INF = 1e9;int n, m; int s[N];int main() {scanf("%d%d", &n, &m);for (int i = 1; i <= n && scanf("%d", &s[i]); i ++ ) s[i] += s[i - 1];int res = INF;for (int i = 1, j = 1; i <= n; i ++ ){while (j + 1 <= i && s[i] - s[j + 1 - 1] >= m) j ++ ;if (j <= i && s[i] - s[j - 1] >= m) res = min(res, s[i] - s[j - 1]);}for (int i = 1, j = 1; i <= n; i ++ ){while (j + 1 <= i && s[i] - s[j + 1 - 1] >= m) j ++ ;if (j <= i && s[i] - s[j - 1] == res) printf("%d-%d\n", j, i);} }

1046 Shortest Distance (20 分)

  • 思路 :前綴和
  • 語法 :swap和min和maxswap和min和maxswapminmax只需要iostreamiostreamiostream頭文件;while里面如果要使得結尾無空行,判斷條件是m!=0而不是m!=1
#include <iostream>using namespace std;const int N = 1e5 + 10;int s[N];int main() {int n;cin >> n;for (int i = 1; i <= n; i ++ ) cin >> s[i], s[i] += s[i - 1];int m;cin >> m;while (m -- ){int l, r;cin >> l >> r;if (r < l) swap(l, r);cout << min(s[r - 1] - s[l - 1], s[n] - s[r - 1] + s[l - 1]);if (m != 0) cout << endl;} }

1048 Find Coins (25 分)

題意 :

  • 給一序列,要求從中選出兩個值使得它們的和恰好等于m
#include <iostream> #include <algorithm> using namespace std;const int N = 1e5 + 10;int n, m; int a[N];int main() {scanf("%d%d", &n, &m);for (int i = 0; i < n && scanf("%d", &a[i]); i ++ );sort(a, a + n);for (int i = 0, j = n - 1; i < n; i ++ ){while (a[i] + a[j] > m && j > i) j -- ;if (j > i && a[i] + a[j] == m){printf("%d %d\n", a[i], a[j]);return 0;}}puts("No Solution"); }

1085 Perfect Sequence (25 分)

題意 :

  • 給定一個正整數序列和一個正整數 p。
  • 如果 M≤m×p 成立,則該序列被稱為完美序列,其中 M 和 m 分別是序列中的最大和最小數。
  • 現在給定一個序列和一個參數 p,你應該從序列中找到盡可能多的數字以構成一個完美的子序列。輸出最多可以選擇多少個數

思路 :

  • 右邊界右移時,左邊界必然不動或右移,不會走回頭路,因此這是雙指針
  • 相乘,注意long long
#include <iostream> #include <algorithm> using namespace std;const int N = 1e5 + 10;int n, p; int a[N];int main() {scanf("%d%d", &n, &p);for (int i = 0; i < n && scanf("%d", &a[i]); i ++ );sort(a, a + n);int res = 0;for (int l = 0, r = 0; r < n; r ++ ){while ((long long)a[l] * p < a[r]) l ++ ;res = max(res, r - l + 1);}printf("%d", res); }

1117 Eddington Number (25 分)

題意 :

  • 找最大的k,滿足序列中有k個數都超過k
#include <iostream> #include <algorithm> using namespace std;const int N = 1e5 + 10;int a[N];int main() {int n; scanf("%d", &n);for (int i = 1; i <= n && scanf("%d", &a[i]); i ++ );sort(a + 1, a + n + 1);for (int i = n; i; i -- )if (a[n - i + 1] > i){printf("%d", i);return 0;}printf("0"); }

1148 Werewolf - Simple Version (20 分)

  • 題意 :in ascending order 升序
  • 思路 :以兩個狼人為假設(枚舉時j為i+1,不重不漏),如果謊話數不是1就no,然后再統計總的謊話數如果不是2就no;謊話數的判斷,傳入第幾個人以及兩個狼人分別是誰這三個參數,如果這個人判斷的是人類,…,如果判斷的是狼人…。
#include <iostream>using namespace std;const int N = 110;int q[N];int judge(int k, int i, int j) // 1為假話,0為真話 {int t = q[k];if (t > 0){if (t == i || t == j)return 1;return 0;}t = -t;if (t == i || t == j) return 0;return 1; }int main() {int n;cin >> n;for (int i = 1; i <= n; i ++ ) cin >> q[i];for (int i = 1; i <= n; i ++ )for (int j = i + 1; j <= n; j ++ ){int s = 0;s = judge(i, i, j) + judge(j, i, j);if (s != 1) continue;s = 0;for (int k = 1; k <= n; k ++ )s += judge(k, i, j);if (s != 2) continue;cout << i << ' ' << j;return 0;}cout << "No Solution";return 0; }

1051 Pop Sequence (25 分)

題意 :

  • 已知棧的入棧序列是1-n,棧的最大容量是m,給k組詢問,問是否能獲得這樣的出隊序列

思路 :

  • 直接模擬放入和pop的過程,每次放入i后,判斷當前棧內數量,以及按所給出隊序列順序出隊元素;最后如果棧不為空,則說明不能得到這樣的出隊序列

語法 :

  • 使用棧的top之前記得使用size
#include <iostream> #include <stack> using namespace std;const int N = 1e3 + 10;int m, n, k; int a[N];bool check() {stack<int> stk;for (int i = 1, j = 0; i <= n; i ++ ){stk.push(i);if (stk.size() > m) return false;while (stk.size() && stk.top() == a[j]) stk.pop(), j ++ ;}return stk.empty(); }int main() {scanf("%d%d%d", &m, &n, &k);while (k -- ){for (int i = 0; i < n && scanf("%d", &a[i]); i ++ );if (check()) puts("YES");else puts("NO");} } 與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

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

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