链接:https://www.nowcoder.com/acm/contest/143/A
来源:牛客网
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 get.
输入描述:
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
备注:
1≤ n≤ 105 0≤ k < n 1≤ s[i],c[i] ≤ 103
#include <bits/stdc++.h>
using namespace std;
int a[100010];
int b[100010];
double s[100010];
int n,k;
int gg(double w){
for(int i=1;i<=n;i++){
s[i]=a[i]*b[i]-a[i]*w;
}
sort(s+1,s+1+n);
double q=0;
for(int i=k+1;i<=n;i++)
q+=s[i];
if(q>=0)
return 1;
else
return 0;
}
double soer(double l,double r){
double mid;
while(l+0.0000001<r){
mid=(l+r)/2;
if(gg(mid)){
l=mid;
}
else
r=mid;
}
return l;
}
int main(){
while(scanf("%d %d",&n,&k)!=EOF){
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int j=1;j<=n;j++)
scanf("%d",&b[j]);
int l=0,r=1.0;
for(int i=1;i<=n;i++){
if(a[i]*b[i]>r)
r=a[i]*b[i];
}
printf("%.10lf\n",soer(l,r));
}
}