链接: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,
你可以删除最多 k 门课,求你的总绩点最大能到多少
分析:
01分数规划模板
代码:
#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=200010;
ll n,m,k;
double c[maxn],x[maxn];
double a[maxn];
double ans,ct,cnt,tmp,flag;
bool jud(double mid)
{
for(int i=1;i<=n;i++)a[i]=(x[i]*c[i])-x[i]*mid;
sort(a+1,a+1+n);
double ans=0.0;
for(int i=n;n-i<k;i--)
{
ans+=a[i];
}
return (ans>=0.0);
}
int main()
{
while(cin>>n>>k)
{
k=n-k;
for(int i=1;i<=n;i++) cin>>x[i];
for(int i=1;i<=n;i++) cin>>c[i];
double l=0,r=1000.0;
while(r-l>1e-9)
{
double mid=(l+r)/2.0;
if(jud(mid)) l=mid;
else r=mid;
}
printf("%.11f\n",l);
}
return 0;
}