【问题标题】:Maximum number of equal elements in array数组中相等元素的最大数量
【发布时间】:2012-11-09 23:04:55
【问题描述】:

我正在从 codeforces 实践问题中解决问题。 我无法找到有效的解决方案。 如何解决以下问题? 我只能想到一个蛮力解决方案

Polycarpus 有一个数组,由 n 个整数 a1, a2, ..., an 组成。当数组中的数字匹配时,Polycarpus 喜欢它。这就是为什么他希望数组有尽可能多的相等数字。为此,Polycarpus 多次执行以下操作:

他选择数组ai、aj(i ≠ j)的两个元素; 他同时将数字 ai 加 1,将数字 aj 减 1,即执行 ai = ai + 1 和 aj = aj - 1。 给定的操作恰好改变了两个不同的数组元素。 Polycarpus 可以无限次应用所描述的操作。

现在他想知道如果他执行任意数量的此类操作,他可以​​获得多少相等的数组元素。帮助 Polycarpus。

输入 第一行包含整数 n (1 ≤ n ≤ 105) — 数组大小。第二行包含以空格分隔的整数 a1, a2, ..., an (|ai| ≤ 104) — 原始数组。

输出 打印一个整数——如果他执行任意数量的给定操作,他可以​​获得的相等数组元素的最大数量。

Sample test(s)
input
2
2 1
output
1
input
3
1 4 1
output
3

【问题讨论】:

    标签: algorithm


    【解决方案1】:

    求所有元素的总和。

    如果总和%n==0 则 n 否则 n-1

    编辑:解释:

    首先很容易发现答案是最小 n-1。它不能更小。

    证明:选择您希望作为目标的任何数字。假设最后一个索引 n。现在您通过对 a1 和 an 应用操作来制作 a1=target。类似地对 a2 和 an 等等。所以所有数字除了最后一个等于目标。

    现在我们需要看到,如果 sum%n==0 则所有数字都是可能的。显然,您可以在这里选择目标作为所有数字的平均值。您可以通过选择值小于平均值的索引来应用操作和其他值大于平均值的,并使其中一个(可能两者)等于平均值​​。

    【讨论】:

    • 虽然很可能是正确的,但如果您提供解释,它将大大提高您的答案质量。您可能还想包括一些数学。
    • @Shahbaz : 不好意思,我觉得这个问题太简单了,作者看到解决方案可能直接得出结论。我现在已经添加了解释
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    相关资源
    最近更新 更多