题目链接: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
题意:就是从n个里面删除最多K个让那个值最大,01分数规划是选n-k个,不难发现删除的话删的越多数值越大(很难发现),然后就套用01分数规划就行了。
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5+5;
const double eps = 1e-6;
int a[MAXN];
int b[MAXN];
double c[MAXN];
int n,k;
int check(double mid)
{
for(int i=0;i<n;i++)
c[i]=a[i]-mid*b[i];
sort(c,c+n);
double ans=0;
for(int i=k;i<n;i++)
ans=ans+c[i];
return ans>=0;
}
void solve()
{
double l=0;
double r=1000000000;
while(r-l>eps)
{
double mid = (l+r)/2;
if(check(mid))
l=mid;
else
r=mid;
}
printf("%.10lf\n",l);
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n;i++)
scanf("%d",&b[i]);
for(int i=0;i<n;i++)
{
int t=a[i];
a[i]=a[i]*b[i];
b[i]=t;
}
solve();
return 0;
}