E. Advertising Agency

https://codeforces.com/problemset/problem/1475/E

题意:n个数中选k个,问值最大的前提下有多少种选取方式,其中n, k <=1000, 数组元素 <= n

思路:对数组逆序排序,统计a[k - 1]的元素数量,并求组合数即可。

总结:一开始用的dp,但是没注意到只能选k个元素,于是把问题搞成了组合数但不限制元素数量的问题,后面审题才发现只能搞k个元素,那就简单了啊,最大和确定,数量也确定,只要找哪些数字有重复的就可以了。既然是逆序排序,那么找的重复的数字肯定只有a[k - 1]位置上的数字,只要看这个数字出现的次数跟实际使用的次数,求组合数即可。

inline void solve() {
    int n, k;
    cin >> n >> k;

    vector<int> a(n);
    map<int, int> cnt;
    for (auto& x : a) {
        cin >> x;
        cnt[x] ++;
    }
    sort(a.rbegin(), a.rend());
    
    int m = 0;
    int base = 0;
    for (int i = 0; i < k; ++i) {
        m += a[i];
        base += (a[i] == a[k - 1]);
    }

    auto fac = [](int x) {
        MInt res = 1;
        while (x >= 1){
            res *= x;
            x --;
        }
        return res;
    };

    cout << (fac(cnt[a[k - 1]]) / fac(base) / (fac(cnt[a[k - 1]] - base))) << '\n';

}
posted @ 2025-07-24 10:02  _Yxc  阅读(11)  评论(0)    收藏  举报