链接: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 题意:删除k节课使gpa最高;
思路:二分答案,看sum(s[i]*(c[i] - ans)) >=0 (k+1<=i<=n)是否成立;(贪心是错的)
下面附上我的代码:
#pragma GCC optimize ("O3")
#include<cstdio>
#include<cmath>
#include<cstring>
#include<map>
#include<set>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
#include<stack>
#include<string>
#define LL long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define lson o<<1
#define rson o<<1|1
#define eps 1e-8
using namespace std;
const int maxn = 1e5 + 10;
double s[maxn];
double c[maxn];
double d[maxn];
int n, k;
double Min(double x, double y)
{
if(x > y)
return y;
return x;
}
double Max(double x, double y)
{
if(x > y)
return x;
return y;
}
int judge(double x)
{
for(int i = 0; i < n; i++)
d[i] = (c[i] - x) * s[i];
sort(d, d + n);
double sum = 0;
for(int i = k; i < n; i++)
sum += d[i];
if(sum >= 0)
return 1;
return 0;
}
int main()
{
cin >> n >> k;
double Mi = -1, Ma = 1005;
for(int i = 0; i < n; i++)
scanf("%lf", &s[i]);
for(int i = 0; i < n; i++)
{
scanf("%lf", &c[i]);
Mi = Min(Mi, c[i]);
Ma = Max(Ma, c[i]);
}
double mid;
while(Ma - Mi >= eps)
{
mid = (Ma + Mi) / 2;
if(judge(mid))
Mi = mid;
else
Ma = mid;
}
printf("%.7lf\n", Ma);
return 0;
}