首页 > 试题广场 >

小美的数组操作

[编程题]小美的数组操作
  • 热度指数:1464 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
小美拿到了一个数组,她每次可以进行如下操作:
选择两个元素,一个加 1,另一个减 1。
小美希望若干次操作后,众数的出现次数尽可能多。你能帮她求出最小的操作次数吗?
众数定义:在一组数据中,出现次数最多的数据,是一组数据中的原数据,而不是相应的次数。 一组数据中的众数不止一个,如数据2、3、-1、2、1、3中,2、3都出现了两次,它们都是这组数据中的众数。

输入描述:
第一行为一个正整数n,代表数组的大小。
第二行输入n个正整数a_i,代表小美拿到的数组。
1\leq n \leq 10^5
1\leq a_i \leq 10^9


输出描述:
一个整数,代表最小的操作次数。
示例1

输入

3
1 4 4

输出

2

说明

第一次操作:第一个数加 1,第二个数减 1。
第二次操作:第一个数加 1,第三个数减 1。
数组变成[3,3,3],众数出现了 3 次。
示例2

输入

3
1 5 5

输出

0

说明

众数出现了 2 次,由于无法再用操作使得众数出现的次数变得更多,所以无需操作。

这题分两种情况,一是可以整出众数为n,不能整除众数为n-1,需要计算最小次数

需要注意,讨论n-1的情况时,根据贪心思想删去最小或最大值,但是要求最优解要考虑减去后的sum/(n-1)的ceil和floor

注意:ceil 时,剩余总和不足,需要补差值,这个差值就是额外操作次数;floor 时,总和已经足够,不需要补


作者:pandaC222
链接:https://www.nowcoder.com/discuss/848171377700925440
来源:牛客网
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int INF = 0x3f3f3f3f3f3f3f3f;
//-1 1 2 2 3 3
//1 1 2 2 3 3
void solve() {
    int n;
    cin>>n;
    vector<int>arr(n+1);
    int sum=0,mx=-1e18,mn=INF;
    for(int i=1;i<=n;i++){
        cin>>arr[i];
        sum+=arr[i];
        mx=max(mx,arr[i]);
        mn=min(mn,arr[i]);
    }
    int ans=0;
    if(sum%n==0){
        int sum1=0;
        int t=sum/n;
        for(int i=1;i<=n;i++){
            if(arr[i]>t) sum1+=arr[i]-t;
        }
        ans=sum1;
    }
    else{
        int sum1=sum,sum2=sum,res1=0,res2=0,res3=0,res4=0;
        sum1-=mx,sum2-=mn;
        int t1=sum1/(n-1),t2=sum2/(n-1),t3=(sum1+n-2)/(n-1),t4=(sum2+n-2)/(n-1);
        int d1=(n-1)-(sum1%(n-1)),d2=(n-1)-(sum2%(n-1));
        sort(arr.begin()+1,arr.end());
        for(int i=1;i<n;i++){
            if(arr[i]>t1) res1+=arr[i]-t1;
            if(arr[i]>t3) res3+=arr[i]-t3;
        }
        for(int i=2;i<=n;i++){
            if(arr[i]>t2) res2+=arr[i]-t2;
            if(arr[i]>t4) res4+=arr[i]-t4;
        }
        ans=min(res1,min(res2,min(res3+d1,res4+d2)));
    }
    cout<<ans;
}
signed main() {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);
    int t = 1;
    // cin>>t;
    while (t--) {
        solve();
    }
    return 0;
}

发表于 2026-02-03 12:10:34 回复(0)