GPA

题目描述

Kanade selected n courses in the university. The academic credit of the i-th course is s[i] and the score of the i-th course is c[i].

At the university where she attended, the final score of her is 

 

Now she can delete at most k courses and she want to know what the highest final score that can ge

 

 

输入描述:

The first line has two positive integers n,k

The second line has n positive integers s[i]

The third line has n positive integers c[i]

输出描述:

Output the highest final score, your answer is correct if and only if the absolute error with the standard answer is no more than 10
-5
示例1

输入

复制
3 1
1 2 3
3 2 1

输出

复制
2.33333333333

说明

Delete the third course and the final score is 
frac{2*2+3*1}{2+1}=frac{7}{3}

备注:

1≤ n≤ 10
5


0≤ k < n

1≤ s[i],c[i] ≤ 103

题解:

http://www.cnblogs.com/perseawe/archive/2012/05/03/01fsgh.html

分数规划,这个式子很容易变换为∑s[i]c[i]-R*∑s[i]=0提取公因式∑s[i]-(c[i]*R)>=0,

其实代码很短,也很好理解,但是为什么这么做并不容易想明白。

#include <bits/stdc++.h>
using namespace std;
const int MAXN=1010;
const double Exp=1e-8;
int s[MAXN],c[MAXN],a[MAXN];
double res[MAXN];
int n,k;
bool judge(double x)
{
    for (int i = 1; i <=n ; ++i) {
        res[i]=s[i]*(c[i]-x);
    }
    sort(res+1,res+n+1);
    double ans=0;
    for (int i = k+1; i <=n ; ++i) {
        ans+=res[i];
    }
    return ans>=0;
}
int main()
{
    scanf("%d%d",&n,&k);
    for (int i = 1; i <=n ; ++i) {
        scanf("%d",&s[i]);
    }
    for (int i = 1; i <=n ; ++i) {
        scanf("%d",&c[i]);
    }
    double l=0,r=1e6;
    while(Exp<r-l){
        double mid=(l+r)*0.5;
        if(judge(mid)) l=mid;
        else
            r=mid;
    }
    printf("%.8lf
",r);
    return 0;
}

  

原文地址:https://www.cnblogs.com/-xiangyang/p/9417731.html