牛客网暑期ACM多校训练营(第五场)A-gpa(01分数规划)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sxh759151483/article/details/81381224

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

∑si*ci/∑si = d     ∑(si*ci - si*d) = 0      ∑si(ci - d) = 0   

二分d看是否为存在结果>=d。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const double inf = 1e-6;
double s[100005], c[100005], a[100005];
int n, k;

bool judge(double mid){
	for(int i = 0; i < n; i++)
		a[i] = s[i] * c[i] - mid * s[i];
	sort(a, a + n);
	double ans = 0;
	for(int i = n - 1; i > k - 1; i--)
		ans += a[i];
	if(ans >= 0)
		return true;
	return false;
}

int main()
{
	scanf("%d%d", &n, &k);
	double maxx = 0;
	for(int i = 0; i < n; i++)
		scanf("%lf", &s[i]);
	for(int i = 0; i < n; i++) {
		scanf("%lf", &c[i]);
		maxx = max(maxx, c[i]);
	}
	
	double l = 0, r = maxx;
	while(r - l > inf) {
		double mid = (l + r) / 2.0;
		if(judge(mid))
			l = mid;
		else
			r = mid;
	}
	printf("%.6lf\n", l);
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/sxh759151483/article/details/81381224