牛客网暑期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; }