链接: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 \frac{2*2+3*1}{2+1}=\frac{7}{3}
备注:
1≤ n≤ 105
0≤ k < n
1≤ s[i],c[i] ≤ 103
题意:给你两个数组, s[i] , c[i] ,再给你一个式子时累加求和的相比求最大值的式子,同时你最多可以再其中删去 K 个字母,问最终最大收益是多少?
思路分析 : 经典的 01分数规划问题,最优的结果一定是去掉越多的值越优,想一想就知道为什么了
代码示例 :
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e6+5;
const int mod = 1e9+7;
const double eps = 1e-9;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
int n, k;
double s[maxn], c[maxn];
double a[maxn];
bool check(double x){
for(int i = 1; i <= n; i++){
a[i] = (c[i]-x)*s[i];
}
sort(a+1, a+1+n);
double sum=0;
for(int i = k+1; i <= n; i++){
sum += a[i];
}
//printf("*** %lf\n", sum);
if (sum > 0) return true;
return false;
}
int main() {
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
cin >> n >> k;
for(int i = 1; i <= n; i++) {
scanf("%lf", &s[i]);
}
for(int i = 1; i <= n; i++) {
scanf("%lf", &c[i]);
}
double l = 0, r = 1000.0;
for(int i = 1; i <= 50; i++){
double mid = (l+r)/2;
if (check(mid)) l = mid;
else r = mid;
}
printf("%.11lf\n", l);
return 0;
}