【发布时间】:2020-12-10 09:28:29
【问题描述】:
我正在尝试解决 CSES 上的公寓问题。对编码非常陌生,而不是在寻找解决方案.. 只是帮助解决问题。
https://cses.fi/problemset/task/1084/.
我想根据成本将 n 个申请人匹配到 m 个公寓,并给出每个人的列表。它适用于样本输入,但许多测试仍然失败。我认为问题在于我在嵌套 for 循环中的向量操作。
失败的测试示例
n 10
m 10
k 10
n integers 90 41 20 39 49 21 35 31 74 86
m integers 14 24 24 7 82 85 82 4 60 95
aptsMatched 的预期结果:6,我的结果:3
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m, k, aptfill, aptsize;
int aptsMatched = 0;
vector<int> desiredSize;
vector<int> apts;
int b=0;
cin >> n;
cin >> m;
cin >> k;
我确信有更好的方法可以做到这一点。但我是全新的,并试图以直观的方式做到这一点。能够使用以下输入成功填充我的向量。
for (int i = 0; i < n; i++) {
cin >> aptfill;
desiredSize.push_back(aptfill);
sort(desiredSize.begin(), desiredSize.end());
reverse(desiredSize.begin(), desiredSize.end());
}
for (int i = 0; i < m; i++) {
cin >> aptsize;
apts.push_back(aptsize);
sort(apts.begin(), apts.end());
reverse(apts.begin(), apts.end());
}
我正在尝试迭代 apts 向量 3x,每次在迭代 desiredSize 向量索引时保持 apts 索引值不变。怀疑嵌套循环有问题 - j 我意识到这段代码非常可怕,并且有更快的方法来实现相同的想法。我首先想了解这种方法(如果一开始没有完全缺陷的话),但我也愿意接受更有效的方法来解决这个问题。 谢谢 for (int i = 0; i < m; i++) {
for (int j = 0; j < desiredSize.size(); j++) {
if (abs(apts[b] - desiredSize[j]) <= k) {
desiredSize.erase(desiredSize.begin() + j);
b++;
aptsMatched++;
break;
}
else {
continue;
}
}
}
cout << aptsMatched;
}
【问题讨论】:
-
一个明显的改进是在输入值后对向量进行排序。无需重复对向量进行排序。
-
else { continue; }是不必要的和分散注意力的。循环会自动继续,您无需请求它们继续。 -
但主要的问题是你没有说出真正的问题。你会撞车吗?出乎意料的结果?为了获得帮助,您确实应该首先说出问题所在。
-
代码运行,但它不会产生所有测试的预期结果。稍后,我将提供我正在尝试的输入以及我的期望
标签: c++ algorithm for-loop vector nested