# Probability of choosing a random pair with maximum sum in an array

Given an array of N integers, You have to find the probability of choosing a random pair(i, j), i < j such that A[i] + A[j] is maximum.

Examples :

```Input : A[] = {3, 3, 3, 3}
Output : 1.0000
Explanation :
Here, maximum sum we can get by selecting
any pair is 6.
Total number of pairs possible = 6.
Pairs with maximum sum = 6.
Probability = 6/6 = 1.0000

Input : A[] = {1, 2, 2, 3}
Output : 0.3333
Explanation :
Here, maximum sum we can get by selecting
a pair is 5.
Total number of pairs possible = 6.
Pairs with maximum sum = {2, 3} and {2, 3} = 2.
Probability = 2/6 = 0.3333
```

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

```Probability(event) = Number of favorable outcomes /
Total number of outcomes```

Naive approach : We can solve this problem using brute force solution overall pair (i, j), i < j to get the maximum value possible and then again do a brute force to calculate the number of times the maximum is attained.

Efficient Approach : Observe that we get maximum pair sum only when the pairs consists of first and second maximum elements of the array. So, the problem is to calculate the number of occurrences of those elements and calculate the favorable outcomes using a formula.

```Favorable outcomes = f2 (frequency of second maximum
element(f2), if maximum element occurs only once).
or
Favorable outcomes = f1 * (f1 - 1) / 2,
(when frequency of maximum element(f1)
is greater than 1).```

## C++

 `// CPP program of choosing a random pair ` `// such that A[i]+A[j] is maximum. ` `#include ` `using` `namespace` `std; ` ` `  `// Function to get max first and second ` `int` `countMaxSumPairs(``int` `a[], ``int` `n) ` `{ ` `    ``int` `first = INT_MIN, second = INT_MIN; ` `    ``for` `(``int` `i = 0; i < n; i++) { ` ` `  `        ``/* If current element is smaller than ` `          ``first,  then update both first and  ` `          ``second */` `        ``if` `(a[i] > first) { ` `            ``second = first; ` `            ``first = a[i]; ` `        ``} ` ` `  `        ``/* If arr[i] is in between first and  ` `        ``second then update second */` `        ``else` `if` `(a[i] > second && a[i] != first) ` `            ``second = a[i]; ` `    ``} ` ` `  `    ``int` `cnt1 = 0, cnt2 = 0; ` `    ``for` `(``int` `i = 0; i < n; i++) { ` `        ``if` `(a[i] == first) ` `            ``cnt1++; ``// frequency of first maximum ` `        ``if` `(a[i] == second) ` `            ``cnt2++; ``// frequency of second maximum ` `    ``} ` `    ``if` `(cnt1 == 1)  ` `        ``return` `cnt2; ` `     `  `    ``if` `(cnt1 > 1)  ` `        ``return` `cnt1 * (cnt1 - 1) / 2;     ` `} ` ` `  `// Returns probability of choosing a pair with ` `// maximum sum. ` `float` `findMaxSumProbability(``int` `a[], ``int` `n) ` `{ ` `    ``int` `total = n * (n - 1) / 2; ` `    ``int` `max_sum_pairs = countMaxSumPairs(a, n); ` `    ``return` `(``float``)max_sum_pairs/(``float``)total; ` `} ` ` `  `// Driver Code ` `int` `main() ` `{ ` `    ``int` `a[] = { 1, 2, 2, 3 }; ` `    ``int` `n = ``sizeof``(a) / ``sizeof``(a); ` `    ``cout << findMaxSumProbability(a, n); ` `    ``return` `0; ` `} `

## Java

 `// Java  program of choosing a random pair ` `// such that A[i]+A[j] is maximum. ` `import` `java.util.Scanner; ` `import` `java.io.*; ` ` `  `class` `GFG { ` `     `  `    ``// Function to get max first and second ` `    ``static` `int` `countMaxSumPairs(``int` `a[], ``int` `n) ` `    ``{ ` `        ``int` `first = Integer.MIN_VALUE, second = Integer.MIN_VALUE; ` `        ``for` `(``int` `i = ``0``; i < n; i++) { ` `     `  `            ``/* If current element is smaller than ` `            ``first, then update both first and  ` `            ``second */` `            ``if` `(a[i] > first)  ` `            ``{ ` `                ``second = first; ` `                ``first = a[i]; ` `            ``} ` `     `  `            ``/* If arr[i] is in between first and  ` `            ``second then update second */` `            ``else` `if` `(a[i] > second && a[i] != first) ` `                ``second = a[i]; ` `        ``} ` `     `  `        ``int` `cnt1 = ``0``, cnt2 = ``0``; ` `        ``for` `(``int` `i = ``0``; i < n; i++) { ` `            ``if` `(a[i] == first) ` `                 `  `                ``// frequency of first maximum ` `                ``cnt1++;  ` `            ``if` `(a[i] == second) ` `                 `  `                ``// frequency of second maximum ` `                ``cnt2++;  ` `        ``} ` `        ``if` `(cnt1 == ``1``)  ` `            ``return` `cnt2; ` `         `  `        ``if` `(cnt1 > ``1``)  ` `            ``return` `cnt1 * (cnt1 - ``1``) / ``2``;  ` `            ``return` `0``; ` `    ``} ` `     `  `    ``// Returns probability of choosing a pair with ` `    ``// maximum sum. ` `    ``static` `float` `findMaxSumProbability(``int` `a[], ``int` `n) ` `    ``{ ` `        ``int` `total = n * (n - ``1``) / ``2``; ` `        ``int` `max_sum_pairs = countMaxSumPairs(a, n); ` `        ``return` `(``float``)max_sum_pairs/(``float``)total; ` `    ``} ` `     `  `    ``// Driver Code ` `    ``public` `static` `void` `main (String[] args) { ` ` `  `         `  `        ``int` `a[] = { ``1``, ``2``, ``2``, ``3` `}; ` `        ``int` `n = a.length;; ` `        ``System.out.println(findMaxSumProbability(a, n)); ` `         `  `         `  `         `  `// This code is contributed by ajit ` `    ``} ` `} `

## Python 3

 `# Python 3 program of choosing a random  ` `# pair such that A[i]+A[j] is maximum. ` ` `  `# Function to get max first and second ` `def` `countMaxSumPairs(a, n): ` ` `  `    ``first ``=` `0` `    ``second ``=` `0` `    ``for` `i ``in` `range``(n): ` ` `  `        ``# If current element is smaller than ` `        ``# first, then update both first and  ` `        ``# second  ` `        ``if` `(a[i] > first) : ` `            ``second ``=` `first ` `            ``first ``=` `a[i] ` ` `  `        ``# If arr[i] is in between first and  ` `        ``# second then update second  ` `        ``elif` `(a[i] > second ``and` `a[i] !``=` `first): ` `            ``second ``=` `a[i] ` ` `  `    ``cnt1 ``=` `0` `    ``cnt2 ``=` `0` `    ``for` `i ``in` `range``(n): ` `        ``if` `(a[i] ``=``=` `first): ` `            ``cnt1 ``+``=` `1` `# frequency of first maximum ` `        ``if` `(a[i] ``=``=` `second): ` `            ``cnt2 ``+``=` `1` `# frequency of second maximum ` `     `  `    ``if` `(cnt1 ``=``=` `1``) : ` `        ``return` `cnt2 ` `     `  `    ``if` `(cnt1 > ``1``) : ` `        ``return` `cnt1 ``*` `(cnt1 ``-` `1``) ``/` `2` ` `  `# Returns probability of choosing a pair  ` `# with maximum sum. ` `def` `findMaxSumProbability(a, n): ` ` `  `    ``total ``=` `n ``*` `(n ``-` `1``) ``/` `2` `    ``max_sum_pairs ``=` `countMaxSumPairs(a, n) ` `    ``return` `max_sum_pairs ``/` `total ` ` `  `# Driver Code ` `if` `__name__ ``=``=` `"__main__"``: ` `     `  `    ``a ``=` `[ ``1``, ``2``, ``2``, ``3` `] ` `    ``n ``=` `len``(a) ` `    ``print``(findMaxSumProbability(a, n)) ` ` `  `# This code is contributed by ita_c `

## C#

 `// C# program of choosing a random pair ` `// such that A[i]+A[j] is maximum. ` `using` `System; ` ` `  `public` `class` `GFG{ ` `     `  ` `  `    ``// Function to get max first and second ` `    ``static` `int` `countMaxSumPairs(``int` `[]a, ``int` `n) ` `    ``{ ` `        ``int` `first = ``int``.MinValue, second = ``int``.MinValue; ` `        ``for` `(``int` `i = 0; i < n; i++) { ` `     `  `            ``/* If current element is smaller than ` `            ``first, then update both first and  ` `            ``second */` `            ``if` `(a[i] > first)  ` `            ``{ ` `                ``second = first; ` `                ``first = a[i]; ` `            ``} ` `     `  `            ``/* If arr[i] is in between first and  ` `            ``second then update second */` `            ``else` `if` `(a[i] > second && a[i] != first) ` `                ``second = a[i]; ` `        ``} ` `     `  `        ``int` `cnt1 = 0, cnt2 = 0; ` `        ``for` `(``int` `i = 0; i < n; i++) { ` `            ``if` `(a[i] == first) ` `                 `  `                ``// frequency of first maximum ` `                ``cnt1++;  ` `            ``if` `(a[i] == second) ` `                 `  `                ``// frequency of second maximum ` `                ``cnt2++;  ` `        ``} ` `        ``if` `(cnt1 == 1)  ` `            ``return` `cnt2; ` `         `  `        ``if` `(cnt1 > 1)  ` `            ``return` `cnt1 * (cnt1 - 1) / 2;  ` `            ``return` `0; ` `    ``} ` `     `  `    ``// Returns probability of choosing a pair with ` `    ``// maximum sum. ` `    ``static` `float` `findMaxSumProbability(``int` `[]a, ``int` `n) ` `    ``{ ` `        ``int` `total = n * (n - 1) / 2; ` `        ``int` `max_sum_pairs = countMaxSumPairs(a, n); ` `        ``return` `(``float``)max_sum_pairs/(``float``)total; ` `    ``} ` `     `  `    ``// Driver Code ` `    ``static` `public` `void` `Main () ` `    ``{ ` `        ``int` `[]a = { 1, 2, 2, 3 }; ` `        ``int` `n = a.Length;; ` `        ``Console.WriteLine(findMaxSumProbability(a, n)); ` `         `  `    ``} ` `} ` `// This code is contributed by vt_m. `

## PHP

 ` ``\$first``) ` `        ``{ ` `            ``\$second` `= ``\$first``; ` `            ``\$first` `= ``\$a``[``\$i``]; ` `        ``} ` ` `  `        ``// If arr[i] is in between ` `        ``// first and second then  ` `        ``// update second  ` `        ``else` `if` `(``\$a``[``\$i``] > ``\$second` `&&  ` `                 ``\$a``[``\$i``] != ``\$first``) ` `            ``\$second` `= ``\$a``[``\$i``]; ` `    ``} ` ` `  `    ``\$cnt1` `= 0; ` `    ``\$cnt2` `= 0; ` `    ``for` `(``\$i` `= 0; ``\$i` `< ``\$n``; ``\$i``++) ` `    ``{ ` `        ``if` `(``\$a``[``\$i``] == ``\$first``) ` `             `  `            ``// frequency of first maximum ` `            ``\$cnt1``++;  ` `        ``if` `(``\$a``[``\$i``] == ``\$second``) ` `         `  `            ``// frequency of second maximum ` `            ``\$cnt2``++;  ` `    ``} ` `    ``if` `(``\$cnt1` `== 1)  ` `        ``return` `\$cnt2``; ` `     `  `    ``if` `(``\$cnt1` `> 1)  ` `        ``return` `\$cnt1` `* (``\$cnt1` `- 1) / 2;  ` `} ` ` `  `// Returns probability of  ` `// choosing a pair with ` `// maximum sum. ` `function` `findMaxSumProbability(``\$a``, ``\$n``) ` `{ ` `    ``\$total` `= ``\$n` `* (``\$n` `- 1) / 2; ` `    ``\$max_sum_pairs` `= countMaxSumPairs(``\$a``, ``\$n``); ` `    ``return` `(float)``\$max_sum_pairs` `/ (float) ``\$total``; ` `} ` ` `  `    ``// Driver Code ` `    ``\$a``= ``array` `(1, 2, 2, 3 ); ` `    ``\$n` `= sizeof(``\$a``); ` `    ``echo` `findMaxSumProbability(``\$a``, ``\$n``); ` ` `  `// This code is contributed by ajit ` `?> `

Output :

```0.333333
```

My Personal Notes arrow_drop_up Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.

Improved By : jit_t, chitranayal