1. 程式人生 > 其它 >AcWing第10場周賽題解

AcWing第10場周賽題解

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;
}