CF817B题解

我们来看一下这道题:

  1. 先排序,显然前三个的积是最小的 ($a[i]$ > 0)

  2. 设最小三个为 $a[1]$ , $a[2]$ , $a[3]$ ,记 $ans$ 为序列中有多少个与 $a[3]$ 相同

  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; // 以三种情况
}
posted @ 2021-05-30 08:40  wangzhongyuan  阅读(1)  评论(0编辑  收藏  举报  来源