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;
}

浙公网安备 33010602011771号