进阶实验1-3.1 两个有序序列的中位数 (25分)
解题思路:
先比较a数组的中位数a[mid]和b数组的中位数b[mid],如果a[mid]=b[mid],则直接输出;否则,
1)、数组长度为奇数时,
如果a[mid]>b[mid],则丢掉a[mid](不含a[mid])右边的数,和b[mid](不含b[mid])左边的数
如果a[mid]<b[mid],则丢掉a[mid](不含a[mid])左边的数,和b[mid](不含b[mid])右边的数
2)、数组长度为偶数时
如果a[mid]>b[mid],则丢掉a[mid](不含a[mid])右边的数,和b[mid](含b[mid])左边的数
如果a[mid]<b[mid],则丢掉a[mid](含a[mid])左边的数,和b[mid](不含b[mid])右边的数
如此循环,直至两个数组均只剩下一个数,较小者则为所求
#include <stdio.h> int main() { int n; scanf("%d",&n); int a[n],b[n]; int i; for(i=0; i<n; i++) { scanf("%d",&a[i]); } for(i=0; i<n; i++) { scanf("%d",&b[i]); } int i1=0,i2=0,j1=n-1,j2=n-1,mid1=(i1+j1)/2,mid2=(i2+j2)/2; while(i1<j1) { if(a[mid1]==b[mid2]) break; if((i1+j1+1)%2==0) { if(a[mid1]>b[mid2]) { j1=mid1; i2=mid2+1; } else if(a[mid1]<b[mid2]) { i1=mid1+1; j2=mid2; } } else { if(a[mid1]>b[mid2]) { j1=mid1; i2=mid2; } else if(a[mid1]<b[mid2]) { i1=mid1; j2=mid2; } } mid1=(i1+j1)/2; mid2=(i2+j2)/2; } printf("%d",a[mid1]<b[mid2]?a[mid1]:b[mid2]);
return 0; }
勤能补拙,熟能生巧