题解 | #Makes And The Product#

Makes And The Product

https://ac.nowcoder.com/acm/problem/229269

题意

给你一个序列,让你求让最小的方案数

思路

我们可以先排序去重,然后分类讨论

  • 如果的数量,那么我们肯定从这个数字里面任取各就好
  • 如果的数量为,那么我们就从a_2$这个数中任取一个即可
  • 如果的数量为,那么我们就要判断的数量,如果的数量,那么我们就从这个数里面任取两个,如果的数量为,那么我们就从的数字中任取一个

代码

/**
 *    author: andif
 *    created: 23.08.2023 22:26:37
**/
#include<bits/stdc++.h>
using namespace std;

#define de(x) cerr << #x << " = " << x << endl
#define dd(x) cerr << #x << " = " << x << " "
#define rep(i, a, b) for(int i = a; i < b; ++i)
#define per(i, a, b) for(int i = a; i > b; --i)
#define mt(a, b) memset(a, b, sizeof(a))
#define sz(a) (int)a.size()
#define fi first
#define se second
#define qc ios_base::sync_with_stdio(0);cin.tie(0)
#define eb emplace_back
#define all(a) a.begin(), a.end()
using ll = long long;
using db = double;
using pii = pair<int, int>;
using pdd = pair<db, db>;
using pll = pair<ll, ll>;
using vi = vector<int>;
const db eps = 1e-9;

int main() {
    int n; cin >> n;
    vi a(n);
    map<int, int> m;
    rep(i, 0, n) {
        cin >> a[i];
        m[a[i]]++;
    }
    sort(all(a));
    a.erase(unique(all(a)), a.end());
    ll ans = -1;
    int m0 = m[a[0]];
    if (m0 >= 3) {
        ans = 1ll * m0 * (m0 - 1) * (m0 - 2) / 6;
    } else if (m0 == 2) {
        int m1 = m[a[1]];
        ans = 1ll * m0 * (m0 - 1) / 2 * m1;
    } else if (m0 == 1) {
        int m1 = m[a[1]];
        if (m1 >= 2) {
            ans = 1ll * m1 * (m1 - 1) / 2;
        } else {
            int m2 = m[a[2]];
            // de(m2);
            ans = m2;
        }
    }
    cout << ans << '\n';

    return 0;
}
全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务