题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805466364755968
存在内存超限的问题:
#include <cstdio>
const int maxn = 1000010;
int n, m, median;
void merge(int a[], int b[]){
int i = 0, j = 0, count = 0, temp;
while(i < n && j < m){
if(a[i] < b[j])
temp = a[i++];
else
temp = b[j++];
count++;
if(count== median){
printf("%d\n", temp);
return;
}
}
while(i < n){
temp = a[i++];
count++;
if(count == median){
printf("%d\n", temp);
return;
}
}
while(j < n){
temp = b[j++];
count++;
if(count == median){
printf("%d\n", temp);
return;
}
}
}
int k[maxn], l[maxn];
int main(){
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", k+i);
scanf("%d", &m);
for(int i = 0; i < m; i++)
scanf("%d", l+i);
if((m+n) & 1)
median = (m + n) / 2 + 1;
else
median = (m + n) / 2;
merge(k, l);
return 0;
}
少开一个数组,就能解决这个问题:
#include <cstdio>
const int maxn = 200010;
int n, m, median;
int a[maxn], b;
int main(){
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", a+i);
scanf("%d", &m);
if((m+n) & 1)
median = (m + n) / 2 + 1;
else
median = (m + n) / 2;
int i = 0, j = 0, count = 0, temp;
scanf("%d", &b);
while(i < n && j < m){
count++;
if(a[i] < b)
temp = a[i++];
else{
temp = b;
j++;
scanf("%d", &b);
}
if(count == median){
printf("%d\n", temp);
return 0;
}
}
while(i < n){
temp = a[i++];
count++;
if(count == median){
printf("%d\n", temp);
return 0;
}
}
while(j < m){
temp = b;
scanf("%d", &b);
j++;
count++;
if(count == median){
printf("%d\n", temp);
return 0;
}
}
return 0;
}