看了一眼题解,没有题解写尺取法(截至2024.8.31)
首先献上我丑陋的代码:
#include <iostream>
#include <algorithm>
using namespace std;
int n, m, b[100005], t[100005], cur;
struct P {int id, x;} a[100005], ans[100005];
bool cmp1(P x, P y) {return x.x < y.x;}
bool cmp2(P x, P y) {return x.id < y.id;}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
cin >> a[i].x;
a[i].id = i;
}
for (int i = 1; i <= m; ++i) cin >> b[i];
sort(a + 1, a + n + 1, cmp1);
sort(b + 1, b + m + 1);
int j = 1;
for (int i = 1; i <= n; ++i) {
while (j < m && a[i].x > b[j]) ++j;
if (a[i].x == b[j]) ans[++cur] = a[i];
}
sort(ans + 1, ans + cur + 1, cmp2);
for (int i = 1; i <= cur; ++i) cout << ans[i].x << ' ';
return 0;
}
因为排序是O(nlogn)的,所以这种方法相对于二分来说没什么优势(好像还更绕一些)但24篇题解中没有一篇使用这个方法写,我还挺吃惊的。
彩蛋:
如果题目要求按编号顺序输出,还可以简化成这样:
#include <iostream>
#include <algorithm>
using namespace std;
int n, m, a[100005], b[100005];
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];
sort(a + 1, a + n + 1);
sort(b + 1, b + m + 1);
int j = 1;
for (int i = 1; i <= n; ++i) {
while (j < m && a[i] > b[j]) ++j;
if (a[i] == b[j]) cout << a[i] << ' ';
}
return 0;
}
悄悄说一句,我一开始就是这样WA的(逃