Hoj 3149 The median number problem2

来源:互联网 发布:日本出云号航母知乎 编辑:程序博客网 时间:2024/05/16 10:14

题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=3149

分治法求两个等长有序数组的中位数。

使用分治法复杂度可以从O(n)降到O(logn)。

#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>#include <map>#include <queue>#include <algorithm>using namespace std;#define Maxn 300005int median(int *a,int *b,int length){    if(length == 1) return a[0] < b[0] ? a[0] : b[0];    int mid = (length - 1)/2;    if(a[mid] == b[mid]) return a[mid];    if(a[mid] < b[mid])    {        return median(&a[length - mid -1],b,mid+1);    }    else    {        return median(a,&b[length - mid -1],mid+1);    }}int a[Maxn],b[Maxn];int main(){#ifndef ONLINE_JUDGE    freopen("in.txt","r",stdin);#endif    int t;    int n;    int A,B,C,D;    int q;    int len;    scanf(" %d",&t);    while(t--)    {        scanf(" %d",&n);        for(int i=0; i<n; i++) scanf(" %d",&a[i]);        for(int i=0; i<n; i++) scanf(" %d",&b[i]);        scanf(" %d",&q);        for(int i=0; i<q; i++)        {            scanf(" %d %d %d %d",&A,&B,&C,&D);            len = B-A+1;            int ans = median(a+A,b+C,len);            printf("%d\n",ans);        }    }    return 0;}


关于其中的原理解释以及如何求解两个不同长度数组间的中位数请参考博客:http://blog.csdn.net/Hackbuteer1/article/details/7584838
原创粉丝点击