您的位置:首页 > 编程语言 > C语言/C++

浙江大学PAT上机题解析之2-13. 两个有序序列的中位数

2013-09-01 01:59 281 查看
已知有两个等长的非降序序列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
34 5 6
1 2 3

3

5
12
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的,晕死@~@

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ PAT ACM 浙江大学