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≤ n≤ 105
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\n",r); return 0; }