# 序列中位数

题目链接 (opens new window)

注意给的数组默认不是有序的!

模拟题,排序之后,取中位数,然后按照b数组 删 a数组中元素,再取中位数。

#include<bits/stdc++.h>
using namespace std; 

// 计算并返回中位数
double findMedian(vector<int>& nums) {
    int n = nums.size();
    if (n % 2 == 1) {
        return nums[n / 2]; // 奇数长度,返回中间的元素
    } else {
        // 偶数长度,返回中间两个元素的平均值
        return (nums[n / 2] + nums[n / 2 - 1]) / 2.0;
    }
}


int main(){
    int t;
    cin >> t;
    while(t--){
        int n;
        cin>> n;
        vector<int> a(n);
        vector<int> b(n - 1);
        for(int i = 0; i < n; i++){
            cin >> a[i];
        }
        for(int i = 0; i < n - 1; i++){
            cin >> b[i];
        }
        vector<int> nums = a;
        vector<double> answers; 
        
        sort(nums.begin(), nums.end());
      
        // 把中位数放进结果集
        answers.push_back(findMedian(nums));

        for(int i = 0; i < n - 1; i++){ 
            
            int target = a[b[i]];
            // 删除目标值
            nums.erase(find(nums.begin(), nums.end(), target));
            // 把中位数放进结果集
            answers.push_back(findMedian(nums));

        }

        for(auto answer : answers){  
            // 判断是否是整数
            if(answer == (int)answer) printf("%d ", (int)answer);
            else printf("%.1f ", answer);
        }
        cout << endl;
    }

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
上次更新:: 3/4/2025, 5:49:45 PM
@2021-2025 代码随想录 版权所有 粤ICP备19156078号