链接: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≤ 1e5
0≤ k < n
1≤ s[i],c[i] ≤ 1e3
选了n门课,要删掉k门课,给出一行n门课的学分,再给出一行n门课的成绩。删掉k门课后,值最大为多少。
思路:
01分数规划,入门博客https://www.cnblogs.com/zzqsblog/p/5450361.html
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+100;
int n,k;
double p[N],ans;
struct Node
{
int s,c;
}node[N];
double judge(double x)
{
int i;
ans=0;
for(i=1;i<=n;i++)
{
p[i]=1.0*node[i].s*(node[i].c-x);
}
sort(p+1,p+n+1);
for(i=n;i>=k+1;i--)
{
ans+=p[i];
}
return ans;
}
int main()
{
scanf("%d%d",&n,&k);
int i,j;
for(i=1;i<=n;i++)
scanf("%d",&node[i].s);
for(i=1;i<=n;i++)
scanf("%d",&node[i].c);
double l=0.0,r=10000000.0,mid;
while(r-l>1e-8)
{
mid=(l+r)/2;
if(judge(mid)>=0)
l=mid;
else
r=mid;
}
printf("%.7lf\n",mid);
return 0;
}