牛客网暑期ACM多校训练营(第五场) Agpa (最大化平均值)

题目大意:

给定 n 门课以及它们的学分和绩点,定义总绩点是所有课的加权平均数,给定一个数 k, 你可以删除最多 k 门课,求你的总绩点最大能到多少
 

 

 

 

分析:

上面是牛客的官方题解,其实就是移项, 然后按照 c[i] - D 排一下序 然后求前几个的和

AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,k;
const int maxn = 1e7+5;
double t[maxn];
struct no
{
    int s,c;
}a[maxn];
bool cmp(int x,int y)
{
    return x>y;
}
bool bl(double d) {
    double res = 0;
    for (int i = 0; i < n; i++) {
        t[i] = a[i].s * (a[i].c - d);
    }
    sort(t, t + n, cmp);
    for (int i = 0; i < n - k; i++) {
        res += t[i];
    }
    if (res >= 0) return 1;
    return 0;
}
int main( )
{
    scanf("%d%d",&n,&k);
    for(int i=0 ; i<n ; i++)
    scanf("%d",&a[i].s);
    for(int i=0 ; i<n ; i++)
    scanf("%d",&a[i].c);
    double l=0,r=1001;
    double ans=0;
    while (r - l >= 1e-8) {
        double mid = (l + r) / 2.0;
        if (bl(mid)) {
            ans = mid;
            l = mid + 0.000000001;
        } else {
            r = mid - 0.000000001;
        }
    }
    printf("%.11lf\n",ans);
    return 0;
}
View Code

 

posted @ 2018-08-05 13:45  shuai_hui  阅读(197)  评论(0编辑  收藏  举报