After returning from the army Makes received a gift — an array a consisting of n positive integer numbers. He hadn't been solving problems for a long time, so he became interested to answer a particular question: how many triples of indices (i, j, k)(i < j < k), such that ai·aj·ak is minimum possible, are there in the array? Help him with it!
The first line of input contains a positive integer number n (3 ≤ n ≤ 105) — the number of elements in array a. The second line contains n positive integer numbers ai (1 ≤ ai ≤ 109) — the elements of a given array.
Print one number — the quantity of triples (i, j, k) such that i, j and k are pairwise distinct and ai·aj·ak is minimum possible.
4
1 1 1 1
4
5
1 3 2 3 4
2
6
1 3 3 1 3 2
1
In the first example Makes always chooses three ones out of four, and the number of ways to choose them is 4.
In the second example a triple of numbers (1, 2, 3) is chosen (numbers, not indices). Since there are two ways to choose an element 3, then the answer is 2.
In the third example a triple of numbers (1, 1, 2) is chosen, and there's only one way to choose indices.
题意:
给一串数字,在其中选三个数字,使得这三个数字的乘积最小,问有多少个这样的组合
思路:
直接排序乘积最小那么这三个数字必定是最小的三个,又因为数字可能相同,会产成不同结果的情况一共有三种:
1.三个数字都相同 。
2.第一个和第二个不同,第二个与第三个相同。
3.第二个和第三个不同。
实现代码:
#include<iostream> #include<algorithm> #include<map> using namespace std; #define ll long long map<ll,ll>mp; int main() { ll m,i,a[100009]; cin>>m; for(i=0;i<m;i++){ cin>>a[i]; mp[a[i]]++;} sort(a,a+m); ll sum = 0; if(a[0]==a[1]&&a[1]==a[2]){ ll num = mp[a[0]]; sum = (num*(num-1)*(num-2))/6; } if(a[1]!=a[2]){ ll num = mp[a[2]]; sum = num; } if(a[0]!=a[1]&&a[1]==a[2]){ ll num = mp[a[2]]; // num = 99999; sum = (num*(num-1))/2; } cout<<sum<<endl; }