题面
题意
t组样例,每组n个数,给定一个k,问选取k个数组成最大的值,有多少种组合方案
思路
- E题比D题简单太多,一定要先看数据范围啊!!!!,数据范围很小,直接用递归求组合数就行,O(n2)
- 题中让选取最大,肯定是从给定的数中从大到小选,如果是最大的选完,然后才选第二大的,只有这样才会出现多选的情况
- 提前预处理出组合数,然后用map记录每个数字出现的次数(从大到小),然后遍历找到可以求组合数的地方即可
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
const int mod = 1e9 + 7;
int t, n, k;
int c[N][N];
//递归法求组合数(给定的数据范围很小)
void init() {
for (int i = 0; i < N; i++) {
for (int j = 0; j <= i; j++) {
if (!j) c[i][j] = 1;
else c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;
}
}
}
int main() {
init();
cin >> t;
while (t--) {
cin >> n >> k;
map<int, int, greater<int>> mp;
for (int i = 1; i <= n; i++) {
int x;
scanf("%d",&x);
mp[x]++;
}
for(auto it: mp){
int cnt=it.second;
//如果k>cnt 的话,肯定是全选(要保证最大),只有当cnt>=k,才有组合数
if(cnt>=k){
cout<<c[cnt][k]<<endl;
break;
}
//全选的情况下减去cnt
k-=cnt;
}
}
return 0;
}