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';
}

浙公网安备 33010602011771号