//更新之后的题解
#include <bits/stdc++.h>
using namespace std;
int A[200000], n, m;
int i, j, k, mid, val, res;
int main()
{
// freopen("1.txt", "r", stdin);
scanf("%d", &n);
for(int i = 0; i < n; ++i){
scanf("%d", A + i);
}
scanf("%d", &m);
mid = (m + n - 1) / 2 + 1;
scanf("%d", &val);
while(i < n && j < m && k != mid){
if(A[i] < val) res = A[i++];
else res = val, ++j, scanf("%d", &val);
++k;
}
while(i < n && k != mid){
res = A[i++];
++k;
}
while(j < m && k != mid){
res = val;
++j;
scanf("%d", &val);
++k;
}
printf("%d\n", res);
return 0;
}
以下为题目未更改之前的题解
题目:1029. Median (25)
方法一:利用sort直接排序(注意cin会超时)
#include <cstdio>
#include <algorithm>
using namespace std;
long long a[2000001];
int main()
{
int n,size=0,i=0;
scanf("%d",&n);
size+=n;
while(n--)
scanf("%lld",&a[i++]);
scanf("%d",&n);
size+=n;
while(n--)
scanf("%lld",&a[i++]);
sort(a,a+size);
printf("%lld",a[(size-1)/2]);
return 0;
}
方法二:模拟merge排序 < c++版 >
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<long int> v1,v2,vans;
int n;
long int x;
cin>>n;
while(n--){
cin>>x;
v1.push_back(x);
}
cin>>n;
while(n--){
cin>>x;
v2.push_back(x);
}
int size=v1.size()+v2.size();
auto itv1=v1.begin();
auto itv2=v2.begin();
while(itv1!=v1.end()&&itv2!=v2.end()){
if(*itv1<*itv2)
vans.push_back(*itv1++);
else
vans.push_back(*itv2++);
}
while(itv1!=v1.end())
vans.push_back(*itv1++);
while(itv2!=v2.end())
vans.push_back(*itv2++);
cout<<vans[(size-1)/2];
return 0;
}
模拟merge排序< C 语言 版>
#include <stdio.h>
long int a[1000001],b[1000001],ans[2000001];
int main()
{
int asize,bsize,m,i;
scanf("%d",&asize);
for(i=0;i<asize;i++)
scanf("%ld",&a[i]);
scanf("%d",&bsize);
for(i=0;i<bsize;i++)
scanf("%ld",&b[i]);
m=(asize+bsize-1)/2;
int j=0,k=0;
i=0;
while(i<asize&&j<bsize&&k!=m+1){
if(a[i]<b[j])
ans[k++]=a[i++];
else
ans[k++]=b[j++];
}
while(i<asize&&k!=m+1)
ans[k++]=a[i++];
while(j<bsize&&k!=m+1)
ans[k++]=b[j++];
printf("%ld",ans[m]);
return 0;
}
简化版
#include <iostream>
#include <cstdio>
using namespace std;
long int a[10000000],b[10000000];
int main()
{
long int an,bn;
scanf("%ld",&an);
for(long int i=0;i<an;++i)
scanf("%ld",&a[i]);
scanf("%ld",&bn);
for(long int i=0;i<bn;++i)
scanf("%ld",&b[i]);
long int mid=(an+bn+1)/2,cnt=0,i=0,j=0,val=-1;
while(i<an&&j<bn&&cnt<mid)
{
a[i]<b[j]?val=a[i++]:val=b[j++];
++cnt;
}
if(cnt==mid) printf("%ld\n",val);
else
{
if(i<an) while(cnt<mid) ++cnt,val=a[i++];
else while(cnt<mid) ++cnt,val=b[j++];
printf("%ld\n",val);
}
return 0;
}
注:还有一个logn复杂度的解法,具体参考LeetCode