読者です 読者をやめる 読者になる 読者になる

ABC D - Maximum Average Sets

#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <iomanip>

typedef long long ll;
using namespace std;
int main() {
    int n, a, b;
    cin >> n >> a >> b;
    vector<ll> v(n);
    for(int i=0;i<n;i++) {
        cin >> v[i];
    }
    sort(v.begin(), v.end(), greater<ll>());

    int max_cnt = 0;
    int cnt_a = 0, idx_a;
    for(int i=0;i<n;i++) {
        if(v[0] == v[i]) max_cnt++;
    }
    for(int i=0;i<n;i++) {
        if(v[i] == v[a-1]) {
            cnt_a++;
            idx_a = i;
        }
    }
    idx_a++;

    ll dp[55][55];
    dp[0][0] = 1;
    ll ans = 0;
    for(int i=1;i<=50;i++) {
        for(int j=0;j<=50;j++) {
            if(i>0 && j>0) 
                dp[i][j] = dp[i-1][j] + dp[i-1][j-1];
            else 
                dp[i][j] = dp[i-1][j];
        }
    }
    if(max_cnt > a) {
        int lim = min(max_cnt, b);
        for(int i=a;i<=lim;i++) {
            ans += dp[max_cnt][i];
        }
    } else {
        int lim = idx_a - cnt_a;
        ans += dp[cnt_a][a-lim];
    }

    double ave = 0;
    for(int i=0;i<a;i++) {
        ave += v[i];
    }

    cout << fixed << setprecision(6) << ave * 1.0 / a << endl;
    cout << ans << endl;

}