@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 <dave_an...@juno.com 
> <javascript:>>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
>>>
>>>
>>>  -- 
>>  
>>  
>>
>
>

-- 


Reply via email to