浙江大学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的,晕死@~@
浙公网安备 33010602011771号