九度 OJ 1004

题目1004:Median

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:12947

解决:3554

题目描述:

    Given an increasing sequence S of N integers, the median is the number at the middle position. For example, the median of S1={11, 12, 13, 14} is 12, and the median of S2={9, 10, 15, 16, 17} is 15. The median of two sequences is defined to be the median of the non-decreasing sequence which contains all the elements of both sequences. For example, the median of S1 and S2 is 13.
    Given two increasing sequences of integers, you are asked to find their median.

输入:

    Each input file may contain more than one test case.
    Each case occupies 2 lines, each gives the information of a sequence. For each sequence, the first positive integer N (≤1000000) is the size of that sequence. Then N integers follow, separated by a space.
    It is guaranteed that all the integers are in the range of long int.

输出:

    For each test case you should output the median of the two given sequences in a line.

样例输入:
4 11 12 13 14
5 9 10 15 16 17
样例输出:

13


题目大意是: 给出两个数组, 现在要求两个数组 合并成一个数组后的中位数

这题其实我开始的思路是:

首先 分别求 数组 A , B 的中位数 a , b

如 果 a = b 那么 a 就是合并后的中位数

a < b 那么舍弃 数组A 中较小的一部分 ,同时舍弃 数组B 较大的那部分, 要求两次舍弃的长度要相等

b < a 那么舍弃 数组B 中较小的一部分 ,同时舍弃 数组A 较大的那部分, 要求两次舍弃的长度要相等

下面是实现代码: 不过没有AC掉

#include<stdio.h>
using namespace std;
const int N = 1000005;
int a[N];
int b[N];
int Mid_Search(int a[], int b[], int n , int m)
{//s1 d1  m1 a[] s2 d2 m2 b[]
// s1 表示数组a 从s1 开始 d1 结束 同理数组2
    int  s1 = 0 , s2 = 0 , d1= n-1, d2 = m-1;
    int m1, m2;
    while(s1!= d1 || s2 != d2)
    {//求中位数
        m1 = (s1 + d1)/2;
        m2 = (s2 + d2)/2;
        if(a[m1] == b[m2])
        {//先判断两个的中位数是否相等
           return a[m1];
        }
        if(a[m1] < b[m2])
        {//如果a 数组的中位数小于b数组的中位数
            if((s1 + d1)%2 == 0)
            {//数组a 舍弃小的部分 数组b 舍弃大的部分
                s1 = m1;
                d2 = m2;
            }
            else
            {
                //如果为奇数从下一个开始
                s1 = m1  + 1;
                d2 = m2;
            }

        }
        else
        {
             if((d2 + s2)%2 == 0)
             {
                 s2 = m2 ;
                 d1 = m1 ;
             }
             else
             {
                 s2 =  m2 + 1;
                 d1 = m1;
             }
        }
    }
    return (a[s1] < b[s2] ? a[s1] : b[s2]);

}

int main()
{
    int n , m;
    while(scanf("%d" , &n) != EOF)
    {
        for(int i = 0 ; i < n ; i++)
        {
            scanf("%d",&a[i]);
        }
        scanf("%d", &m);
        for(int j = 0 ; j < m ; j++)
        {
            scanf("%d", &b[j]);
        }
        int ans = Mid_Search(a, b, n, m);
        printf("%d\n", ans);
    }
    return 0;

这里先说明一下nth_element 函数的使用

意思是 最终得到 第 I 大元素 并且 放在 第 I 位置上 (这里是从第0 开始数的)

测试代码:

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    int iarray[]={5,6,15,89,7,2,1,3,52,63,12,64,47};
    int len=sizeof(iarray)/sizeof(int);
    int i;
    for(i=0;i<len;i++)
       cout<<iarray[i]<<" ";
    nth_element(iarray,iarray+6,iarray+len);         //排序第6个元素
        cout<<endl;
    for(i=0;i<len;i++)
       cout<<iarray[i]<<" ";
    cout<<"  第6-th个元素     "<<iarray[6]<<endl;
}

来自博客 点击打开链接 这里感谢~

下面是AC 此题代码:

#include<iostream>
#include<algorithm>
using namespace std;

long a[1000000];
int main()
{
   long i, n1, n2 ;
   while(cin>>n1)
   {
       for(i = 0 ; i < n1; i++)
       {
           cin>>a[i];
       }
       cin>>n2;
       for(;i < n1+ n2; i++)
       {
           cin>>a[i];
       }
      long  mid = (i - 1)/2;
      nth_element(a, a+mid, a+i);  //做排列求出中位数
      cout<<a[mid]<<endl;
   }
    return 0;
}



wangxiaoming CSDN认证博客专家 架构 Spring Boot Redis
博客是很好的总结和记录工具,如果有问题,来不及回复,关注微信公众号:程序员开发者社区,获取我的联系方式,向我提问,也可以给我发送邮件,联系 1275801617@qq.com
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页
实付 19.89元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值