1. 程式人生 > >浙江大學PAT上機題解析之2-13. 兩個有序序列的中位數

浙江大學PAT上機題解析之2-13. 兩個有序序列的中位數

已知有兩個等長的非降序序列S1, S2, 設計函式求S1與S2並集的中位數。有序序列A0, A1…AN-1的中位數指A(N-1)/2的值,即第[(N+1)/2]個數(A0為第1個數)。

輸入格式說明:

輸入分3行。第1行給出序列的公共長度N(0<N<=100000),隨後每行輸入一個序列的資訊,即N個非降序排列的整數。數字用空格間隔。

輸出格式說明:

在一行中輸出兩個輸入序列的並集序列的中位數。

樣例輸入與輸出:

序號 輸入 輸出
1
5
1 3 5 7 9
2 3 4 5 6
4
2
6
-100 -10 1 1 1 1
-50 0 2 3 4 5
1
3
3
1 2 3
4 5 6
3
4
3
4 5 6
1 2 3
3
5
1
2
1
1
#include <cstdio>
#include <cstring>
//#include <iostream>
using namespace std;


int Node1[100010];
int Node2[100010];

int main()
{
	memset(Node1,0,sizeof(Node1));
	memset(Node2,0,sizeof(Node2));
	int N=0;
	int mid=0;
	int flag=0;
	int k=0;
	int i=0,j=0;
/*	cin>>N;*/
	scanf("%d",&N);
	int temp=N;
	mid = (2*N+1)/2;
	while(temp--)
	{
	/*	cin>>Node1[i++];*/
		scanf("%d",&Node1[i++]);
	}
	temp=N;
	while(temp--)
	{
    /*cin>>Node2[j++];*/
	scanf("%d",&Node2[j++]);
	}
	for (i=0,j=0;i<N&&j<N;)
	{
		k=i+j+2;
		if (Node1[i]>=Node2[j])
		{
			flag=1;
			j++;
		}
		else 
		{
			flag=2;
			i++;
		}

	if (k==N)
	{
		if (flag==1)
		{
			if (Node2[j]<Node1[i])
	       /* cout<<Node2[j]<<endl;*/
		   printf("%d\n",Node2[j]);
			else
		/*	cout<<Node1[i]<<endl;*/
		  printf("%d\n",Node1[i]);
		}
		if (flag==2)
		{
			 if (Node1[i]<Node2[j])
	     /*   cout<<Node1[i]<<endl;*/
			  printf("%d\n",Node1[i]);
			else
			/* cout<<Node2[j]<<endl;*/
			   printf("%d\n",Node2[j]);
		}
		
		break;
	}
	
	}
	if (N==1)
	{
		if (Node1[0]<Node2[0])
		printf("%d\n",Node1[0]);
		else
		printf("%d\n",Node2[0]);
		
	}
	
	
	//system("pause");
	return 0;
}

//iostream的輸入輸出最後一個CASE會超時,換成stdio就好了,我這一題主要卡在了N==1這一點,調了半天才發現我的K值是大於等於2的,暈死@[email protected]