问题描述:见http://pat.zju.edu.cn/contests/pat-practise/1029

  大概就是两个排好序的序列,求两个序列总的中间数。

解决:

  1、最直接的想法就是将两个数组合并,然后求中间值。由于原来已经排好序,时间复杂度为O(n1+n2),这也算不上是归并排序。

  2、然后我想用O(logn1+logn2)的二分查找的方法,每次提取两个序列的中间值,将mid1和mid2进行比较,将较大者的右边和较小者的左边去掉。

    这样就可以排除一半的数据,即两个数据中心不断靠近。但是实现起来细节处理太麻烦了,最后自己崩溃了,有些case过不了,就先放着不管了。

贴1 的代码:

#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
	int i;
	int n1,n2;
	int *data1;
	int *data2;
	int *data_total;
	int cur1,cur2;

	cin>>n1;
	data1 = new int[n1];
	for(i=0;i<n1;i++)
		scanf("%d",&(data1[i]));
	cin>>n2;
	data2 = new int[n2];
	for(i=0;i<n2;i++)
		scanf("%d",&(data2[i]));
	data_total = new int[n1+n2];

	cur1 = cur2 = 0;
	for(i=0;i<n1+n2;i++)
	{
		if(cur1==n1)
		{
			data_total[i] = data2[cur2++];
		}else if(cur2 == n2)
		{
			data_total[i] = data1[cur1++];
		}else
		{
			if(data1[cur1]<data2[cur2])
				data_total[i] = data1[cur1++];
			else
				data_total[i] = data2[cur2++];
		}

	}
	cout<<data_total[(n1+n2-1)/2]<<endl;

	delete []data1;
	delete []data2;
	delete []data_total;
	cin>>i;
	return 0;
}

  

posted on 2012-11-22 11:29  backing  阅读(301)  评论(0)    收藏  举报