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