ABC57 Maximum Average Sets(组合数学)

Maximum Average Sets

根据题意可知,当取a个的时候平均值是最大的,因为如果再取,一定是比取的第a个小或者等于第a个,所以平均值并不会增加,这样就得到了第一个答案,其次是有多少种方案,因为n<=50,所以可以用杨辉三角预处理求组合数,因为选取的a个数中能改变的只能是其中最小的数,不难证任意改变不是最小的数的话,平均值一定会变,所以考虑最小的数有多少个和选取的a个数中有多少个最小值,如果a中最小值的个数小于最小值一共的数量,说明a中不止存在最小值,还存在更大的数,此时并不能选取更多一直到b个数,所以只能在C[n,m]中选择,如果a中全是最小值,说明如果再往里加入最小值一直到b个数的话平均值不会改变,但方案数是会改变的,此时就需要累加C[n,a]+C[n,a+1]...有多少个就加到多少

AC代码:

#include <bits/stdc++.h>
using namespace std;
using LL = long long;
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    vector<vector<LL>> c(65, vector<LL> (65));
    for (int i = 0; i < 55; 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]);
        }
    }
    int n, a, b;
    cin >> n >> a >> b;
    vector<LL> v(n);
    double ave = 0.0, ans = 0.0;
    map<LL, LL> mp;
    for (int i = 0; i < n; i++) {
        cin >> v[i];
        mp[v[i]]++;
    }
    sort(v.begin(), v.end());
    vector<LL> z;
    int len = 0;
    for (int i = n - 1; i > n - 1 - a; i--) {
        z.push_back(v[i]);
        ave += v[i];
    }
    ans = ave / a;
    int cnt = 0;
    LL minn = *min_element(z.begin(), z.end());
    for (int i = 0; i < a; i++) {
        if (minn == z[i]) {
            cnt++;
        }
    }
    cout << fixed << setprecision(10) << ans << '\n';
    LL q = 0;
    if(cnt < a) {
        q = c[mp[minn]][cnt];
    } else {
        for(int i = a; i <= b && mp[minn] >= i; i++) {
            q += c[mp[minn]][i];
        }
    }
    cout << q << '\n';;
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
组合索引ABC失效可能是由于以下几种情况导致的: 1. 查询条件没有按照索引的最左侧字段进行匹配。对于复合索引,MySQL从左到右使用索引中的字段,一个查询可以只使用索引中的一部分,但只能是最左侧部分。如果查询条件没有按照索引的最左侧字段进行匹配,那么索引就会失效。例如,如果索引是(a, b, c),那么查询条件应该是a = x,而不是b = x或c = x。\[2\] 2. 查询条件中的字段类型不匹配。如果查询条件中的字段类型与索引中的字段类型不匹配,那么索引也会失效。例如,如果索引是(a, b, c),而查询条件中的字段c是字符串类型,那么索引就会失效。因此,确保查询条件中的字段类型与索引中的字段类型一致是很重要的。 3. 查询条件中使用了不等于操作符(例如!=或<>)。对于复合索引,如果查询条件中使用了不等于操作符,那么索引就会失效。因为不等于操作符无法利用索引的有序性进行查找。所以,尽量避免在查询条件中使用不等于操作符,可以考虑使用范围查询或其他方式来替代。\[1\] 综上所述,组合索引ABC失效可能是由于查询条件没有按照索引的最左侧字段进行匹配、查询条件中的字段类型不匹配或使用了不等于操作符等原因导致的。要解决这个问题,可以检查查询条件是否符合索引的使用规则,并确保查询条件中的字段类型与索引中的字段类型一致。 #### 引用[.reference_title] - *1* [复合(组合)索引失效的几种情况总结](https://blog.csdn.net/qq_34977392/article/details/123705944)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [ABC联合索引生效问题(已更新2020-11-17)](https://blog.csdn.net/qq_42630887/article/details/97113323)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值