数组中最大相等元素数

时间:2012-11-21 16:26:00

标签: algorithm

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

Polycarpus有一个数组,由n个整数a1,a2,...,a组成。当阵列中的数字匹配时,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

1 个答案:

答案 0 :(得分:5)

找到所有元素的总和。

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

编辑:解释:

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

证明:选择您想要作为目标的任何数字。并且假设最后一个索引n。现在通过对a1和an进行操作来使a1 =目标。类似地在a2和an等上。所有数字除了最后一个等于目标。

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