zoukankan      html  css  js  c++  java
  • PAT 2-13. 两个有序序列的中位数(25)

    题目链接:http://www.patest.cn/contests/ds/2-13

    解题思路及代码如下:

    /*
    解题思路: 
    分别求出序列A 和B 的中位数,设为a 和b,求序列A 和B 的中位数过程如下:
    1)若a=b,则a 或b 即为所求中位数,算法结束。
    2)若a<b,则舍弃序列A中较小的一半(如果A长度为奇数则保留a,如果为偶数则不保留a),同时舍弃序列B中较大的一半,要求舍弃的长度相等;
    3)若a>b,则舍弃序列A中较大的一半,同时舍弃序列B中较小的一半(如果B长度为奇数则保留b,如果为偶数则不保留b),要求舍弃的长度相等;
    在保留的两个升序序列中,重复过程1)、2)、3),直到两个序列中只含一个元素时为止(即是结束条件),较小者即为所求的中位数。
    (每次执行过程A和B的剩余长度相等,并且要每次更新序列A和B的长度) 
    */
    #include<iostream>
    using namespace std;
    int n,A[100005],B[100005];
    int getMiddle()
    {
    	int AStart=0,AEnd=n-1,BStart=0,BEnd=n-1;
    	int a=A[(n-1)/2];
    	int b=B[(n-1)/2];
    	while(AEnd!=AStart)
    	{
    		if(a==b)
    		{
    			return a;
    		}
    		else if(a<b)
    		{
    			if(n%2==1)
    			{
    				AStart=(AStart+AEnd)/2;
    				a=A[(AEnd+AStart)/2];
    				BEnd=(BStart+BEnd)/2;
    				b=B[(BEnd+BStart)/2];
    				n=n/2+1;
    			}
    			else
    			{
    				AStart=(AStart+AEnd)/2+1;
    				a=A[(AEnd+AStart)/2];
    				BEnd=(BStart+BEnd)/2;
    				b=B[(BEnd+BStart)/2];
    				n=n/2;
    			}
    		}
    		else//a>b
    		{
    			if(n%2==1)
    			{
    				AEnd=(AStart+AEnd)/2;
    				a=A[(AEnd+AStart)/2];
    				BStart=(BStart+BEnd)/2;
    				b=B[(BEnd+BStart)/2];
    				n=n/2+1;
    			}
    			else
    			{
    				AEnd=(AStart+AEnd)/2;
    				a=A[(AEnd+AStart)/2];
    				BStart=(BStart+BEnd)/2+1;
    				b=B[(BEnd+BStart)/2];
    				n=n/2;
    			}
    		}
    	}
    	return a<b?a:b;
    }
    int main()
    {
    	cin>>n;
    	for(int i=0;i<n;i++)
    	{
    		cin>>A[i];
    	}
    	for(int i=0;i<n;i++)
    	{
    		cin>>B[i];
    	}
    	cout<<getMiddle()<<endl;
    	return 0;
    }
    

      

  • 相关阅读:
    29 顺时针打印矩阵(四-画图让抽象问题形象化)
    27 二叉树镜像(四-画图让抽象问题形象化)
    java的4种代码块
    Eclipse中连接Sql Sever2008 -----转自Yogurshine
    java之HashMap的遍历Iterator
    java之插入排序
    java之选择排序
    java之冒泡排序
    java之快速排序
    java之折半查找
  • 原文地址:https://www.cnblogs.com/CHLL55/p/4340603.html
Copyright © 2011-2022 走看看