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

AcWing第17場周賽題解

A. 3971. 最小的商

題目連結:https://www.acwing.com/problem/content/3974/

題目大意:從陣列中找最大的 k 的因數,並輸出 k 除以它的商。

解題思路:迴圈一遍就可以了。

示例程式:

#include <bits/stdc++.h>
using namespace std;

int T, n, k, a, ans;

int main() {
    cin >> T;
    while (T--) {
        cin >> n >> k;
        ans = k;
        while (n--) {
            cin >> a;
            if (k % a == 0) ans = min(ans, k/a);
        }
        cout << ans << endl;
    }
    return 0;
}

B. 3972. 方格集數量

題目連結:https://www.acwing.com/problem/content/3975/

題目大意:略。

解題思路:設同一行或同一列具有某個顏色的各自數量為 \(m\),則對應的方案數為 \(2^m - 1\)。然後把它們加起來。

但是需要注意只選一個的方案數(\(n \times m\) 中)即包含在行又包含在列重了,所以要減去。

示例程式:

#include <bits/stdc++.h>
using namespace std;
int n, m, a, r[55], c[55];
long long ans;

long long cal(int m) {
    return (1LL<<m) - 1;
}

int main() {
    cin >> n >> m;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> a;
            if (a) r[i]++, c[j]++;
        }
    }
    for (int i = 0; i < n; i++)
        ans += cal(r[i]) + cal(m - r[i]);
    for (int i = 0; i < m; i++)
        ans += cal(c[i]) + cal(n - c[i]);
    ans -= n * m;
    cout << ans << endl;
    return 0;
}

C. 3973. 無線網路

題目連結:https://www.acwing.com/problem/content/3976/

題目大意:略。

解題思路:二分答案。對於二分的距離,模擬一遍即可。

示例程式:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
int n, m;
long long a[maxn], b[maxn];

bool check(long long r) {
    int j = 0;
    for (int i = 0; i < n; i++) {
        while (j < m && b[j] + r < a[i]) j++;
        if (j == m) return false;
        if (b[j] - r > a[i]) return false;
    }
    return true;
}

int main() {
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i++) scanf("%lld", a+i);
    for (int i = 0; i < m; i++) scanf("%lld", b+i);
    long long l = 0, r = 2e9, res;
    while (l <= r) {
        long long mid = (l + r) / 2;
        if (check(mid)) res = mid, r = mid - 1;
        else l = mid + 1;
    }
    printf("%lld\n", res);
    return 0;
}