第一遍刷PAT
题目意思
给两个递增序列,找出这两个序列中所有的数组成的序列的中位数
因为两个都是递增的序列,所以就用一个计数器,两边都数小的数,数到一半就是中位数了
测试点提示
第三个测试点是a数组全部在中位数左侧
第六个测试点是b数组全部在中位数左侧
注意一下输出细节就好了吧
我的憨憨程序
#include<bits/stdc++.h>
using namespace std;
int main()
{
long m,n,cnt=-1,mid,flag=0;
long a[200010]={0},b[200010]={0};
scanf("%ld",&m);
for(long i=0;i<m;i++)
scanf("%ld",&a[i]);
scanf("%ld",&n);
mid=(m+n-1)/2;
for(long i=0;i<n;i++)
scanf("%ld",&b[i]);
long i=0,j=0;
while(i<m&&j<n&&cnt<mid)//数a序列
{
while(j<n&&cnt<mid)//数b序列
{
cnt++;
if(cnt==mid)//数到一半了
{
if(b[j]>a[i])
printf("%ld\n",a[i]);
else
printf("%ld\n",b[j]);
break;
}
if(b[j]>a[i])//如果a中的那个数比b中的那个数小,就继续数a
break;
j++; //否则数b
}
if(j==n&&cnt<mid)//如果b中的数已经数完了还没数到一半
{
printf("%ld\n",a[i+mid-cnt-1]);//直接用差值找到中位数
cnt=mid;//bug点:不要忘记更新计数器的值 ,否则会影响后面的判断
break;
}
i++;
}
if(cnt<mid)//如果a里面的数完了还没数到中点
printf("%ld\n",b[j+mid-cnt-1]);//直接用差值找到中位数
}