俊介三

一天更新一点,一天积累一点

导航

PAT-1029

Posted on 2013-03-06 14:14  俊介三在前进  阅读(183)  评论(0)    收藏  举报

1029. Median (25)

http://pat.zju.edu.cn/contests/pat-a-practise/1029

题目大意,给两个从小到大排好的数组,求这两个数组有序合并在一起的大数组的中位数。

思路:两个数组各给一个指针,比较并往后移动,走了一定的步数后,把数输出来。

//最初没弄好指针的含义,导致错了几次。指针的含义是:所指的位置为“还没访问的地方的首位”。

#include <stdio.h>

int arr1[1000005];
int arr2[1000005];

int main(){
    int N,M;
    int i,j;
    scanf("%d",&N);
    for(i=0;i<N;i++){
        scanf("%d",&arr1[i]);
    }
    scanf("%d",&M);
    for(i=0;i<M;i++){
        scanf("%d",&arr2[i]);
    }
    int ptr1=0,ptr2=0;//指向未被包含的首位
    int mid = (N+M-1)/2;
    while(1){
        if(arr1[ptr1]<arr2[ptr2]&&ptr1!=N){
            ptr1++;
            if(ptr1+ptr2-1==mid){
                printf("%d\n",arr1[ptr1-1]);
                return 0;
            }
        }
        if(arr1[ptr1]>=arr2[ptr2]&&ptr2!=M){
            ptr2++;
            if(ptr1+ptr2-1==mid){
                printf("%d\n",arr2[ptr2-1]);
                return 0;
            }
        }
        if(ptr1==N){
            ptr2++;
            if(ptr1+ptr2-1==mid){
                printf("%d\n",arr2[ptr2-1]);
                return 0;
            }
        }
        if(ptr2==M){
            ptr1++;
            if(ptr1+ptr2-1==mid){
                printf("%d\n",arr1[ptr1-1]);
                return 0;
            }
        }
    }
    return 0;
}