正题
题目大意
nnn个东西,有ai,bia_i,b_iai,bi。选择kkk个,使得∑ai/∑bi\sum a_i/\sum b_i∑ai/∑bi最大。
解题思路
∑ai/∑bi=k\sum a_i/\sum b_i=k∑ai/∑bi=k
∑ai/∑bi/k=1\sum a_i/\sum b_i/k=1∑ai/∑bi/k=1
∑ai/k=∑bi\sum a_i/k=\sum b_i∑ai/k=∑bi
那么
∑(ai/k−bi)>=0\sum (a_i/k-b_i)>=0∑(ai/k−bi)>=0
然后二分kkk就好了
然后每次选取ai/k−bia_i/k-b_iai/k−bi最大的kkk个就好了
codecodecode
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=100010;
int n,k;
double l,r,a[N],b[N],c[N];
bool check(double ks)
{double ans=0;for(int i=1;i<=n;i++){c[i]=a[i]/ks-b[i];}sort(c+1,c+1+n);for(int i=n;i>=n-k+1;i--)ans+=c[i];return (ans>=0);
}
int main()
{//freopen("data.in","r",stdin);//freopen("data.out","w",stdout);scanf("%d%d",&n,&k);for(int i=1;i<=n;i++)scanf("%lf",&a[i]);for(int j=1;j<=n;j++)scanf("%lf",&b[j]);l=1e-4;r=20000;while(r-l>1e-6){double mid=(l+r)/2;if(check(mid)) l=mid;else r=mid;}printf("%0.3lf",l);
}