Codeforces Round #382 (Div. 2)B. Urbanization 贪心

来源:互联网 发布:鲁滨逊漂流记游戏java 编辑:程序博客网 时间:2024/06/01 20:06

题目链接:这里
题意:一共有n个数,第i个数是a[i],现在你需要选出n1个数和n2个数,使得那n1个数的和除以n1加上n2个数的和除以n2的值最大。
解法:贪心,如果n1>n2,那么交换。然后选择最大的n1个数为n1集合,然后次大的n2个数为n2集合。
代码:

//CF 735B#include <bits/stdc++.h>using namespace std;const int maxn = 1e5+7;int n, n1, n2, nn1, nn2;double a[maxn];int main(){    cin >> n >> n1 >> n2;    for(int i = 0; i < n; i++) cin >> a[i];    if(n1 > n2) swap(n1, n2);    nn1 = n1, nn2 = n2;    sort(a, a+n, greater<double>());    double sum1 = 0, sum2 = 0;    for(int i = 0; i < n; i++){        if(n1){            sum1 += a[i];            n1--;        }        else if(n2){            sum2 += a[i];            n2--;        }    }    double ans = (sum1/(1.0*nn1)) + (sum2/(1.0*nn2));    printf("%.10f\n", ans);    return 0;}
0 0