这个题纯属降智,直接放一个数组里用sort就行。我还以为数据量很大,然后必须要用特殊的方法,我人傻了。
下面是最简单想法
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m;
cin >> n;
vector<int>s1(n);
for (int i = 0; i < n; i++)
scanf("%d", &s1[i]);
cin >> m;
s1.resize(n + m);
for (int i = n; i < n + m; i++)
scanf("%d", &s1[i]);
sort(s1.begin(), s1.end());
printf("%d", s1[(n + m - 1) / 2]);
return 0;
}
这个是用坐标来解决,时间复杂度好像差不多。代码复杂度高😄
#include <bits/stdc++.h>
using namespace std;
vector<long long> v1, v2;
int main() {
int n1, n2, pos, f1 = 0, f2 = 0;
scanf ("%d", &n1);
v1.resize(n1);
for(int i = 0; i < n1; i++) scanf ("%lld", &v1[i]);
scanf ("%d", &n2);
v2.resize(n2);
for (int i = 0; i < n2; i++) scanf ("%lld", &v2[i]);
pos = (n1 + n2 + 1) / 2;
int i = 0, j = 0, cnt = 0;
while (i < n1 && j < n2) {
if (v1[i] <= v2[j]) {
i++;
cnt++;
if (cnt == pos) {
printf ("%lld", v1[i - 1]);
break;
}
}
else {
j++;
cnt++;
if (cnt == pos) {
printf ("%lld", v2[j - 1]);
break;
}
}
}
// cout << i << " " << n1 << endl;
if (i == n1) {
while (cnt != pos) {
j++;
cnt++;
if (cnt == pos) {
printf ("%lld", v2[j - 1]);
break;
}
}
}
else {
while (cnt != pos) {
i++;
cnt++;
if (cnt == pos) {
printf ("%lld", v1[i - 1]);
break;
}
}
}
}