题意:给你一个数组。找到三个数乘积最小 问有多少种方式取这三个数
思路:对数组进行排序,找到最前面三个数然后进行分类讨论
#include<bits/stdc++.h>
using namespace std;
int a[100005],b[100005];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[i]=a[i];
}
sort(b+1,b+n+1);
set<int>s;
for(int i=1;i<=3;i++)
s.insert(b[i]);
if(s.size()==1)//三个数全都一样
{
long long cnt=0;
for(int i=1;i<=n;i++)
if(a[i]==b[1])cnt++;
long long ans=cnt*(cnt-1)*(cnt-2);
cout<<ans/6<<endl;
}
else if(s.size()==2)
{
long long cnt=0;
if(b[1]==b[2]) //1 1 2 前2个数一样 答案取决于第三个数的数量
{
for(int i=1;i<=n;i++)
if(a[i]==b[3])cnt++;
cout<<cnt<<endl;
}
else if(b[2]==b[3])// 1 2 2 后2个数一样 答案取决于后2个数的数量拿2个的不同方法数
{
for(int i=1;i<=n;i++)
if(a[i]==b[3])cnt++;
long long ans=cnt*(cnt-1)/2;
cout<<ans<<endl;
}
}
else if(s.size()==3)//三个数都不同 三个不同数的数量乘起来
{
int x=0,y=0,z=0;
for(int i=1;i<=n;i++)
{
if(a[i]==b[1])x++;
else if(a[i]==b[2])y++;
else if(a[i]==b[3])z++;
}
cout<<x*y*z<<endl;
}
}