CF817B题解
我们来看一下这道题:
-
先排序,显然前三个的积是最小的 ($a[i]$ > 0)
-
设最小三个为 $a[1]$ , $a[2]$ , $a[3]$ ,记 $ans$ 为序列中有多少个与 $a[3]$ 相同
-
结果需分情况讨论:
-
若$a[1] = a[3]$ ,即最小三个相同,只要从序列中与 $a[3]$ 相同的数中取三个,可得答案:$ans * (ans - 1) * (ans - 2) ÷ 6$
-
若不满足以上条件,$a[2] = a[3]$ ,那么 $a[1]$ 必须选,再从与 $a[3]$ 相同的数中取两个,可得答案:$ans * (ans - 1) ÷ 2$
-
若不满足以上条件,即都是前两个必须选,再从与 $a[3]$ 相同的数中取一个,可得答案:$ans$
具体可看代码:
#include <iostream>
#include <algorithm>
using namespace std;
#define int long long
int a[100010];
signed main() {
int n, ans = 0; cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
}
sort (a + 1, a + n + 1); // 排序
for (int i = 1; i <= n; ++i) {
if (a[i] == a[3]) ans ++;
} // 找出于 a[3] 相同的数有多少个
if (a[1] == a[3]) cout << ans * (ans - 1) * (ans - 2) / 6 << endl; // 第一种情况
else if (a[2] == a[3]) cout << ans * (ans - 1) / 2 << endl; // 第二种情况
else cout << ans << endl;
return 0; // 以三种情况
}