【题目】http://codeforces.com/problemset/problem/817/B
【题意】给出一串数字,从这串数字中取3个数使乘积最小,问有多少种取法
【思路】记录每个数出现的次数,找到最小的3个数,
1:如果3个数一样,那么答案是C(cnt(x),3);
2:如果x1和x2一样,与x3不同,那么答案就是 cnt(x3);(x1和x2的cnt当然是2啊,C(2,2)=1啊)
3:x1!=x2时当然x1!=x3;
4:x2==x3时,答案是C(cnt(x2),2);
5:x1!=x2!=x3时,答案是cnt(x3);
【代码】
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const ll M=1e9+10;
const ll N=1e9+10;
map<ll,ll>cnt;
ll combination(ll n,ll m)
{
ll i,j;
ll sum=1;
if(n==0||m==0)
return 1;
else
{
for( i=m+1,j=1;i<=n;i++,j++)
{
sum=sum*i/j;
}
return sum;
}
}
int main()
{
ll n;
cin>>n;
ll m1=N,m2=N,m3=N;
for(ll i=0; i<n; i++)
{
ll t;
scanf("%lld",&t);
if(t<m1)
{
m3=m2;
m2=m1;
m1=t;
}
else if(t<m2)
{
m3=m2;
m2=t;
}
else if(t<m3)
{
m3=t;
}
cnt[t]++;
}
//cout<<cnt[m1]<<cnt[m2]<<cnt[m3]<<endl;
if(m1==m2&&m1==m3)
cout<<combination(cnt[m1],3)<<endl;
else if((m1==m2&&m1!=m3))
cout<<cnt[m3]<<endl;
else if((m2==m3&&m1!=m2))
cout<<combination(cnt[m2],2)<<endl;
else
cout<<cnt[m3]<<endl;
}