CSUOJ 1212: 中位数

http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1212

这道题要找到中位数,我的方法是将两个序列的数字比较,然后将小的那个放入s中,

当s的计数器过了N后,就可以跳出比较的循环,输出s[N]。

#include<stdio.h>
#include<stdlib.h>
#define MAXD 100005
int s[MAXD], N, a[2 * MAXD];
int main()
{
while( scanf( "%d", &N) == 1)
{
for( int i = 1; i <= 2 * N; i ++)
scanf( "%d", &a[i]);
int i = 1, j = N + 1;
int top = 1;
while( true)
{
if( a[i] < a[j]) {
s[top ++] = a[i];
i ++;
}
else {
s[top ++] = a[j];
j ++;
}
if( top == N + 1) break;
}
printf( "%d\n", s[N]);
}
return 0;
}

下面的代码开始不知为何错误了,SWM指出了我的错误,排出的数列不是有序的,没考虑第一个数组大的情况...

#include<stdio.h>
#include<stdlib.h>
#define MAXD 100005
int s[MAXD], N, a[MAXD], b;
int main()
{
while( scanf( "%d", &N) == 1)
{
for( int i = 1; i <= N; i ++)
scanf( "%d", &a[i]);
int i = 1, j = N;
int top = 1;
while( j --)
{
scanf( "%d", &b);
if( a[i] < b) {
s[top ++] = a[i];
i ++;
}
else {
if( top <= N)
s[top ++] = b;
}
}
printf( "%d\n", s[N]);
}
return 0;
}

下面是标程:

/*
B中位数
这道题是2011年数据结构考研真题。
序列A和B的中位数设为a和b
1)若a == b 则直接得到中位数
2)若a < b 则舍弃A中较小一半,B中较大一半,舍弃长度相等
3)若a > b 则舍弃B中较小一半,A中较大一半,舍弃长度相等
重复过程1),2),3)知道两个序列都只剩下一个元素为止,较小者为中位数。
qsort水过是件挺无聊的事情。
*/
/*By CSGrandeur 2011.11.28*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXN 110000
int a[MAXN], b[MAXN];
int M_Search(int n)
{
int s1 = 0, d1 = n - 1, m1, s2 = 0, d2 = n - 1, m2;
while(s1 < d1 || s2 < d2)
{
m1 = s1 + d1 >> 1;
m2 = s2 + d2 >> 1;
if(a[m1] == b[m2])
return a[m1];
if(a[m1] < b[m2])
{
if((s1 + d1) % 2 == 0)
s1 = m1, d2 = m2;
else
s1 = m1 + 1, d2 = m2;
}
else
{
if((s2 + d2) % 2 == 0)
s2 = m2, d1 = m1;
else
s2 = m2 + 1, d1 = m1;
}
}
return a[s1] < b[s2] ? a[s1] : b[s2];
}

int main()
{
int i, j, n;
/* freopen("test.in", "rb", stdin);
freopen("test.out", "wb", stdout);
*/
while(scanf("%d", &n) != EOF)
{
for(i = 0; i < n; i ++)
scanf("%d", &a[i]);
for(i = 0; i < n; i ++)
scanf("%d", &b[i]);
printf("%d\n", M_Search(n));
}
return 0;
}

 



 

你可能感兴趣的:(OJ)