zoukankan      html  css  js  c++  java
  • 进阶实验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; }
    勤能补拙,熟能生巧
  • 相关阅读:
    final发布用户使用报告
    PSP总结报告
    每周例行报告
    王者荣耀交流协会final发布-第3次scrum立会
    每周例行报告
    王者荣耀交流协会互评Beta版本--爱阅app
    Beta发布用户使用报告
    每周例行报告
    Beta冲刺第二周王者荣耀交流协会第六次会议
    每周例行报告
  • 原文地址:https://www.cnblogs.com/snzhong/p/12435481.html
Copyright © 2011-2022 走看看