A——gpa牛客多校2018第五场(二分

链接: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));
	}
} 

猜你喜欢

转载自blog.csdn.net/doublekillyeye/article/details/81381187