题解:B4242 [海淀区小学组 2025] 蜂窝网络
zhouzihan20110620 · · 题解
题目解析+做法优化+详细代码
题目解析
题目描述很清晰,就是要找最小的
做法优化
考虑最朴素的做法:从小到大枚举
我们要考虑两层优化:
第一层即为对于
第二层优化是判断是否满足条件,可以不用遍历每一个
这两层优化考虑完成,就可以得到
可以证明最优复杂度即为
详细代码
//O(2*10^9nm)30pts
#include <iostream>
#include <algorithm>
using namespace std;
long long n, m, a[100005], b[100005], r;
int main()
{
cin >> n >> m;
for (int i = 1;i <= n;i++)
{
cin >> a[i];
}
for (int i = 1;i <= m;i++)
{
cin >> b[i];
}
while (1)
{
bool flag = 1;
for (int i = 1;i <= n;i++)
{
bool nflag = 0;
for (int j = 1;j <= m;j++)
{
if (abs(b[j] - a[i]) <= r)
{
nflag = 1;
break;
}
}
if (!nflag)
{
flag = 0;
break;
}
}
if (flag)
{
break;
}
r++;
}
cout << r;
return 0;
}
//O(30nm)70pts
#include <iostream>
#include <algorithm>
using namespace std;
long long n, m, a[100005], b[100005], l, r, mid, ans;
bool check(long long x)
{
bool flag = 1;
for (int i = 1;i <= n;i++)
{
bool nflag = 0;
for (int j = 1;j <= m;j++)
{
if (abs(b[j] - a[i]) <= x)
{
nflag = 1;
break;
}
}
if (!nflag)
{
flag = 0;
break;
}
}
return flag;
}
int main()
{
cin >> n >> m;
for (int i = 1;i <= n;i++)
{
cin >> a[i];
}
for (int i = 1;i <= m;i++)
{
cin >> b[i];
}
l = 0;
r = 2e9 + 1;
while (l <= r)
{
mid = (l + r) >> 1;
if (check(mid))
{
ans = mid;
r = mid - 1;
}
else
{
l = mid + 1;
}
}
cout << ans;
return 0;
}
//O(30nlogm)100pts
#include <iostream>
#include <algorithm>
using namespace std;
long long n, m, a[100005], b[100005], l, r, mid, ans;
bool check(long long x)
{
bool flag = 1;
for (int i = 1;i <= n;i++)
{
long long p = lower_bound(b + 1, b + m + 1, a[i]) - b;
if (a[i] - b[p - 1] > x && b[p] - a[i] > x)
{
flag = 0;
break;
}
}
return flag;
}
int main()
{
cin >> n >> m;
for (int i = 1;i <= n;i++)
{
cin >> a[i];
}
b[0] = -9e18;
for (int i = 1;i <= m;i++)
{
cin >> b[i];
}
sort(b + 1, b + m + 1);
b[m + 1] = 9e18;
l = 0;
r = 2e9 + 1;
while (l <= r)
{
mid = (l + r) >> 1;
if (check(mid))
{
ans = mid;
r = mid - 1;
}
else
{
l = mid + 1;
}
}
cout << ans;
return 0;
}
//O(nlogm)100pts
#include <iostream>
#include <algorithm>
using namespace std;
long long n, m, a[100005], b[100005], ans;
int main()
{
cin >> n >> m;
for (int i = 1;i <= n;i++)
{
cin >> a[i];
}
sort(a + 1, a + n + 1);
b[0] = -9e18;
for (int i = 1;i <= m;i++)
{
cin >> b[i];
}
sort(b + 1, b + m + 1);
b[m + 1] = 9e18;
for (int i = 1;i <= n;i++)
{
long long p = lower_bound(b + 1, b + m + 1, a[i]) - b;
ans = max(ans, min(a[i] - b[p - 1], b[p] - a[i]));
}
cout << ans;
return 0;
}
//O(nlogn+mlogm+n+m)100pts
#include <iostream>
#include <algorithm>
using namespace std;
long long n, m, a[100005], b[100005], nowi, ans;
int main()
{
cin >> n >> m;
for (int i = 1;i <= n;i++)
{
cin >> a[i];
}
sort(a + 1, a + n + 1);
b[0] = -9e18;
for (int i = 1;i <= m;i++)
{
cin >> b[i];
}
sort(b + 1, b + m + 1);
b[m + 1] = 9e18;
for (int i = 1;i <= n;i++)
{
while (b[nowi] < a[i])
{
nowi++;
}
ans = max(ans, min(a[i] - b[nowi - 1], b[nowi] - a[i]));
}
cout << ans;
return 0;
}
至此,本题讲解完毕。
蒟蒻的第一篇题解,求过QAQ。