@Ansum: Notice that the problem does not ask to give a method of making as
many numbers as possible equal, but only what the maximum number is. Here
is an algorithm for achieving an array with the equality numbers I
specified:
1. If the sum of the numbers is a multiple of n, then avg = sum/n is the
target number. If every number is not equal to avg, find a number a[i] in
the array that is smaller than avg and a number a[j] that is larger than
avg. Then set a[i] = a[i]+1 and a[j] = a[j]-1. Repeat until every number
equals avg. Result is that n numbers are equal.
2. If the sum of the numbers is not a multiple of n, pick any number, say
a[1], as the target value. If there is any number a[k] from k = 2 to n-1
such that a[k] != a[1], increase or decrease a[k] by 1 to make it closer to
a[1] and respectively decrease or increase a[n] by 1. Repeat until every
number a[k] = a[1] for k = 2 to n-1. Then a[1] to a[n-1] are equal but a[n]
cannot be equal because then the sum of the numbers would be a multiple of
n. Result is that n-1 numbers are equal.
Since you don't have to produce the maximally equal array, the algorithm I
gave is the solution. Here it is in code (with C's 0-based array indexing):
int maxEqual( int n, int a[])
{
int i, sum = 0;
for( i = 0 ; i < n ; ++i )
sum += a[i];
return if sum % n == 0 ? n : n - 1;
}
Dave
On Thursday, November 22, 2012 1:25:43 AM UTC-6, Ansum Baid wrote:
> @Dave: Can you give a little insight on your approach?
>
> On Wed, Nov 21, 2012 at 6:52 PM, Dave >wrote:
>
>> @Ansum: Polycarpus should start by summing the numbers. If the sum is
>> divisible by n, then n numbers can be made equal. If the sum is not
>> divisible by n, then only n-1 numbers can be made equal.
>>
>> Dave
>>
>> On Wednesday, November 21, 2012 12:18:54 PM UTC-6, Ansum Baid wrote:
>>
>>> This question has been taken from codeforces.com. Any idea how to
>>> solve this ?
>>>
>>> Polycarpus has an array, consisting of *n* integers *a*1, *a*2, ..., *a*
>>> *n*. Polycarpus likes it when numbers in an array match. That's why he
>>> wants the array to have as many equal numbers as possible. For that
>>> Polycarpus performs the following operation multiple times:
>>>
>>>
>>>- he chooses two elements of the array *a**i*, *a**j* (*i* ≠ *j*);
>>>- he simultaneously increases number *a**i* by 1 and decreases
>>>number *a**j* by 1, that is, executes *a**i* = *a**i* + 1 and *a**j*=
>>>*a**j* - 1.
>>>
>>> The given operation changes exactly two distinct array elements.
>>> Polycarpus can apply the described operation an infinite number of times.
>>>
>>> Now he wants to know what maximum number of equal array elements he can
>>> get if he performs an arbitrary number of such operation. Help Polycarpus.
>>> Input
>>>
>>> The first line contains integer *n* (1 ≤ *n* ≤ 105) — the array size.
>>> The second line contains space-separated integers *a*1, *a*2, ..., *a**n
>>> * (|*a**i*| ≤ 104) — the original array.
>>> Output
>>>
>>> Print a single integer — the maximum number of equal array elements he
>>> can get if he performs an arbitrary number of the given operation.
>>> Sample test(s)
>>> input
>>>
>>> 2
>>> 2 1
>>>
>>> output
>>>
>>> 1
>>>
>>> input
>>>
>>> 3
>>> 1 4 1
>>>
>>> output
>>>
>>> 3
>>>
>>>
>>> --
>>
>>
>>
>
>
--