【发布时间】:2020-09-03 17:24:36
【问题描述】:
这是来自 CSES 问题集的问题。
有 n 个申请人和 m 个免费公寓。您的任务是分配公寓,以便尽可能多的申请人获得公寓。
每个申请人都有自己想要的公寓大小,他们会接受任何与期望大小足够接近的公寓。
输入
第一行输入三个整数n、m、k: 申请人、公寓数量和允许的最大数量 区别。
下一行包含 n 个整数 a1,a2,…,an:所需的公寓 每个申请人的大小。如果申请人的期望大小是 x,他 或者她会接受任何大小在 x−k 和 x+k 之间的公寓。 最后一行包含 m 个整数 b1,b2,…,bm:每个公寓的大小。
输出
Print one integer: the number of applicants who will get an apartment.约束
1 ≤ n, m ≤ 2e5 0 ≤ k ≤ 1e9 1 ≤ ai, bi ≤ 1e9
我的尝试
#include <iostream>
#include <set>
#include <vector>
#include <algorithm>
#include <utility>
typedef long long int ll;
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n, m, k;
cin >> n >> m >> k;
vector<int> vn, vm;
for (int i = 0; i < n; i++)
{
int p;
cin >> p;
vn.push_back(p);
}
for (int i = 0; i < m; i++)
{
int p;
cin >> p;
vm.push_back(p);
}
int c = 0;
sort(vn.begin(), vn.end());
sort(vm.begin(), vm.end());
for (int i = 0; i < m; i++)
{
for (int j = 0; j < vn.size(); j++)
{
if (vm[i] <= vn[j] + k && vm[i] >= vn[j] - k)
{
c++;
vn.erase(vn.begin() + j);
break;
}
if (vn[j] < vm[i] - k)
{
vn.erase(vn.begin() + j);
j--;
continue;
}
if (vn[j] > vm[i] + k)
{
break;
}
}
}
cout << c << "\n";
}
我在某些测试用例中超出了时间限制。
【问题讨论】:
-
在实施解决方案之前,您应该真正弄清楚解决方案的时间复杂度,这样您就不会浪费时间实施永远不够快的东西。乍一看,您的代码似乎至少是
O(n^2)或O(nm),这对于n, m <= 2e5来说绝对不够快。 -
我想知道你能不能把两个 5 号的住户放在一个 10 号的公寓里?
-
如果你有一个严格的“一个公寓 - 一个居住者”规则,只需将你的居住者和公寓放入一个数组中,排序 (O(NlogN) 并进行一次传递 (O(N) ) 使用简单的
if-then-else逻辑找出公寓-居住者对。 -
你能用文字描述你的算法,把代码归为备用解释吗?根据该描述,您预计复杂度是多少?
标签: c++ algorithm sorting search