链接:https://www.nowcoder.com/acm/contest/143/A
来源:牛客网
gpa
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
Special Judge, 64bit IO Format: %lld
题目描述
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
题目:考虑01分数规划
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=100005;
const double eps=1.0e-6;
int n,k;
double a[maxn],b[maxn],s[maxn];
double d[maxn];
bool judge(double x)
{
for(int i=1;i<=n;i++)
{
d[i]=a[i]-x*s[i];
}
sort(d+1,d+n+1);
double sum=0;
for(int i=k+1;i<=n;i++)
{
sum+=d[i];
}
return sum>=0.0;
}
int main()
{
int i;
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++)
scanf("%lf",&s[i]);
for(i=1;i<=n;i++)
scanf("%lf",&b[i]);
for(i=1;i<=n;i++)
a[i]=s[i]*b[i];
double l=0;
double r=0x3f3f3f3f;
while((r-l)>eps)
{
double mid=(l+r)/2;
if(judge(mid)) l=mid;
else r=mid;
}
printf("%.11f\n",l);
}