链接: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
题解:
感想:
这道题就是0,1分数规划的应用。
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const double inf = 1e-6;
const int maxn = 1e5+5;
double a[maxn];
double b[maxn];
double f[maxn];
int solve(double x,int n,int k)
{
for(int i = 0; i < n; i++)
f[i] = a[i]*b[i]-x*a[i];
sort(f, f+n);
double ans = 0;
for(int i = n-1; i > k-1; i--)
ans += f[i];
if(ans >= 0)
return 1;
return 0;
}
int main()
{
int t;
int n, k ;
cin >> n >> k;
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(f, 0, sizeof(f));
double maxx = 0;
for(int i = 0; i < n; i++)
scanf("%lf", &a[i]);
for(int i = 0; i < n; i++)
{
scanf("%lf", &b[i]);
maxx = max(maxx, b[i]);
}
double l = 0;
double r = maxx;
while(r-l > inf)
{
double m = (r+l)/2;
if(solve(m, n, k))
l = m;
else
r = m;
}
printf("%.6lf\n", l);
return 0;
}
关于01分数规划具体解释可参考:http://www.cnblogs.com/perseawe/archive/2012/05/03/01fsgh.html