AcWing第10場周賽題解
阿新 • • 發佈:2022-04-09
A. 3787. 整除
題目連結:https://www.acwing.com/problem/content/3790/
題目大意:a 加幾次 1 能夠被 b 整除。
解題思路:如果 a % b == 0
,則 0 次;否則,b - a % b
次。不用 if 的話用 (b - a % b) % b
也可以。
示例程式:
#include <bits/stdc++.h> using namespace std; int T, a, b; int main() { cin >> T; while (T--) { cin >> a >> b; cout << (b - a % b) % b << endl; } return 0; }
B. 3788. 截斷陣列
題目連結:https://www.acwing.com/problem/content/3791/
題目大意:切成兩段和相等。
解題思路:字首和。求有多少字首和等於和的一半。
示例程式:
#include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 5; int n, cnt, a[maxn]; int main() { cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; a[i] += a[i-1]; } for (int i = 1; i < n; i++) if (a[i]*2 == a[n]) cnt++; cout << cnt << endl; return 0; }
C. 3789. 隱藏字串
題目連結:https://www.acwing.com/problem/content/3792/
題目大意:略。
解題思路:
這題最重要的是任何一個長度為 3 的子序列都對應有一個長度為 2 的子序列。例:任何一個子序列 "abc" 都對應有一個子序列 "ab"。因為前 2 個下標確定的情況下第 3 個下標也是確定的。
所以本題我們只需要找長度為 1 和 2 的子序列出現的最多次數即可。
示例程式:
#include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 5; char s[maxn]; long long c1[26], c2[26][26], ans; int main() { cin >> s; for (int i = 0; s[i]; i++) { int a = s[i] - 'a'; for (int j = 0; j < 26; j++) c2[j][a] += c1[j]; c1[a]++; } for (int i = 0; i < 26; i++) { ans = max(ans, c1[i]); for (int j = 0; j < 26; j++) ans = max(ans, c2[i][j]); } cout << ans << endl; return 0; }