PAT (Advanced Level) Practice A1029 Median (25 分)(C++)(甲级)(归并、中位数)

1029 Median (25 分)
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 nondecreasing 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.

Input Specification:

Each input file contains one test case. Each case occupies 2 lines, each gives the information of a sequence. For each sequence, the first positive integer N (≤2×10
​5
​​ ) 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.

Output Specification:

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

Sample Input:

4 11 12 13 14
5 9 10 15 16 17
Sample Output:

13

using namespace std;
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include <ctime>
#include <cmath>

int A[200010] = {0};//只能申请一个数组,否则内存不够用
const int INF = (1<<31)-1;//无穷大

int main()
{
    int N, M, i, j, cnt = 0, mid, x;
    scanf("%d", &N);
    for(i=0; i<N; i++) scanf("%d", &A[i]);//把第一个存入数组,第二个边输入边查询
    A[N] = INF;//结尾处设置为无穷大
    scanf("%d", &M);
    mid = (N+M-1)/2;//查询位置
    scanf("%d", &x);//先给x输入一个数,避免
    for(i=0, j=0; cnt < mid; cnt++)
    {
        if(j >= M) x = INF;
        if(x < A[i]) scanf("%d", &x), j++;
        else i++;
    }
    printf("%d", min(A[i], x));
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要找出一个数组的位数,可以按照以下步骤进行操作: 1. 首先,对数组进行排序,确保数组的元素按照升序(从小到大)排列。 2. 然后,根据数组的长度分为两种情况: - 如果数组长度是奇数,那么位数就是排序后数组的间元素。 - 如果数组长度是偶数,那么位数就是排序后数组的间两个元素的平均值。 3. 最后,返回得到的位数。 下面是使用 C++ 实现的示例代码: ```cpp #include <iostream> #include <vector> #include <algorithm> double findMedian(std::vector<int>& nums) { int n = nums.size(); std::sort(nums.begin(), nums.end()); if (n % 2 == 0) { // 数组长度为偶数 int mid1 = n / 2; int mid2 = mid1 - 1; return (nums[mid1] + nums[mid2]) / 2.0; } else { // 数组长度为奇数 int mid = n / 2; return nums[mid]; } } int main() { std::vector<int> nums = {4, 2, 7, 5, 1}; double median = findMedian(nums); std::cout << "Median of the array: " << median << std::endl; return 0; } ``` 在示例代码,我们使用了 `std::sort` 函数对数组进行排序。然后,根据数组的长度判断位数是单个元素还是两个元素的平均值,并返回相应的结果。 在给定的数组 `{4, 2, 7, 5, 1}` ,排序后的数组为 `{1, 2, 4, 5, 7}`,因此位数为 4。 注意:在实际场景,如果数组很大,可以考虑使用更高效的排序算法,例如快速排序或归并排序,以提高性能。这里仅为了示例目的使用了标准库的排序函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值