链接:https://www.nowcoder.com/acm/contest/143/A
来源:牛客网
时间限制: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
题意:给你n科的学分和成绩,你最多可以删除k(k<n)门课,求最大GPA。(GPA=∑该课学分*该课成绩/∑该课学分)
思路:典型的分数规划。首先一定是要删k门课的。因为这样能保证GPA最大。设第i科学分为x[i],分数为c[i]。
然后对于∑x[i]*c[i]/∑x[i]>=a 移项得∑x[i]*c[i]-a*∑x[i]>=0。然后就可以二分a,每次o(n)求出x[i]*c[i]-a*x[i];排序取前n-k项,看和是否>=0即可
代码:
#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;
}
cout<<fixed<<setprecision(11)<<l<<endl;
// if(flag) puts("Yes"); else puts("No");
}
return 0;
}