牛客多校第五場 A(01分數規劃)
阿新 • • 發佈:2019-02-14
時間限制: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
看著就是一臉“我是01分數規劃”的樣子
讓a[i]=s[i]c[i] b[i]=s[i],就變成01分數規劃了
找前k大的可以用nth_element找
#include<bits/stdc++.h> #define mp make_pair #define fir first #define se second #define ll long long #define pb push_back using namespace std; const int maxn=2e5+10; const ll mod=1e9+7; const int maxm=1e6+10; const double eps=1e-7; const int inf=0x3f3f3f3f; const double pi = acos (-1.0); int n,k; pair<ll ,ll >p[maxn]; pair<ll,ll> p1[maxn]; double temp[maxn]; int check(double mid){ for (int i=0;i<n;i++){ temp[i]=p1[i+1].fir-mid*p1[i+1].se; } nth_element(temp,temp+n-k,temp+n); reverse(temp,temp+n); double sum=0; for (int i=0;i<k;i++) sum+=temp[i]; return sum>0; } int main(){ scanf("%d %d",&n,&k); k=n-k; for (int i=1;i<=n;i++){ scanf("%lld",&p[i].fir); } for (int i=1;i<=n;i++){ scanf("%lld",&p[i].se); } for (int i=1;i<=n;i++){ p1[i].fir=p[i].fir*p[i].se; p1[i].se=p[i].fir; } double l=0,r=1000; for (int i=0;i<100;i++){ double mid=(l+r)/2; if (check(mid)){ l=mid; } else r=mid; } printf("%.14f\n",max(l,r)); return 0; }