专栏文章

题解:P13753 【MX-X17-T2】The median of sum

P13753题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mioa4ewc
此快照首次捕获于
2025/12/02 15:51
3 个月前
此快照最后确认于
2025/12/02 15:51
3 个月前
查看原文

问题分析

本题要求将数组元素不重不漏地划分为任意数量的组,使得所有组和的中位数(第k+12\lfloor\frac{k+1}{2}\rfloor小的数)最小。通过分析可知,中位数的位置与分组数量kk相关,我们需要找到最优的分组策略来最小化这个中位数。

思路

  1. 关键观察
    • 当所有元素均为非负数时,最优策略是将最小元素单独分为一组,其余元素分成另一组。此时排序后第n+12\lfloor\frac{n+1}{2}\rfloor小的元素就是数组的最小元素。
    • 当存在负数时,最优策略是将所有负数合并为一组,正数单独成组。此时负数组的和会成为中位数(或更靠前的位置),且这是能得到的最小可能值。
  2. 算法步骤
    • 对数组进行排序,便于快速获取最小元素和区分正负。
    • 若数组最小元素为非负数,直接输出该最小元素。
    • 若存在负数,计算所有负数的和并输出。

AC代码

CPP
#include<bits/stdc++.h>
using namespace std;
int a[1000005];
int main(){
    int T;
    cin>>T;
    while(T--){
        int n;
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>a[i];
        }
        sort(a+1,a+n+1);  // 排序数组,便于处理
        if(a[1]>=0){  // 所有元素非负的情况
            cout<<a[1]<<"\n";
        }
        else{  // 存在负数的情况
            long long ans=0;
            for(int i=1;i<=n;i++){
                if(a[i]<=-1){  // 累加所有负数
                    ans+=a[i];
                }
            }
            cout<<ans<<"\n";
        }
    }
    return 0;\\完美结束
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...