AcWing第17場周賽題解
阿新 • • 發佈:2022-04-11
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; }