题140.pat甲级练习-1029 Median (25 分)
一、题目
二、题解
本题就是要你求两个非递减序列合并之后的中位数,若第一个数编号为1,最后一个数编号为k,显然题目所说的中位数位置为k/2,所以我们不妨将res从下标为1开始放,这样便于不过脑地输出(当时就nt从下标为0开始放,然后还直接输出res[k/2])
#include <bits/stdc++.h>
using namespace std;
int S1[200005],S2[200005];
int res[400010];
int main()
{
int N1,N2;
cin>>N1;
for(int i=1;i<=N1;i++)
{
cin>>S1[i];
}
cin>>N2;
for(int i=1;i<=N2;i++)
{
cin>>S2[i];
}
int i=1,j=1,k=1;//这里k初始为1很关键,中位数为N1+N2/2,从下标为1开始放,直接访问k/2下res中的元素才不会有错
while(i<=N1&&j<=N2)
{
if(S1[i]<S2[j])
{
res[k++]=S1[i++];
}
else
{
res[k++]=S2[j++];
}
}
while(i<=N1)
{
res[k++]=S1[i++];
}
while(j<=N2)
{
res[k++]=S2[j++];
}
cout<<res[k/2];
}