首页 > 试题广场 >

小美的数组操作

[编程题]小美的数组操作
  • 热度指数:1780 时间限制: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 次,由于无法再用操作使得众数出现的次数变得更多,所以无需操作。
用Python做的,27/30的通过率,来个大佬看看哪出问题了
whileTrue:
    try:
        sum = 0
        ave = 0
        ave1 = 0
        ave2 = 0
         
        n = int(input())
        a = list(map(int,input().split()))
        a = sorted(a)
        fori in range(n):
            sum += a[i]
        ifsum % n == 0:
            fori in range(n):
                ave += abs(sum / n - a[i])
            print(int(ave / 2))
        elif sum - a[0] * n > a[-1] * n - sum:
            sum -= a[0]
            ifsum / (n - 1) - sum // (n - 1) > 0.5:
                med = sum // (n - 1) + 1
            else:
                med = sum // (n - 1)
            fori in range(n - 1):
                ifa[i + 1] < med:
                    ans1 = med - a[i + 1]
                    ave1 += ans1
                else:
                    ans2 = a[i + 1] - med               
                    ave2 += ans2
            print(int(((ave1 + ave2)-abs(ave1 - ave2)) / 2+ abs(ave1 - ave2)))
        else:
            sum -= a[-1]
            ifsum / (n - 1) - sum // (n - 1) > 0.5:
                med = sum // (n - 1) + 1
            else:
                med = sum // (n - 1)
            fori in range(n - 1):
                ifa[i] < med:
                    ans1 = med - a[i]
                    ave1 += ans1
                else:
                    ans2 = a[i] - med               
                    ave2 += ans2
            print(int(((ave1 + ave2)-abs(ave1 - ave2)) / 2+ abs(ave1 - ave2)))
    except:
        break
发表于 2023-09-06 23:53:32 回复(0)