https://www.nowcoder.com/acm/contest/143/A
二分答案 转为判定性问题 然后同乘分母后移项 再排序 最后取前(n-k)小是当前最优解 看是都符合条件 复杂度n*logn*logn
#include <bits/stdc++.h>
using namespace std;
#define eps 1e-8
struct node
{
double s;
double c;
double val;
};
node ary[100010];
int n,k;
bool cmp(node n1,node n2)
{
return n1.s*(n1.c-n1.val)>n2.s*(n2.c-n2.val);
}
bool judge(double val)
{
double sum;
int i;
for(i=1;i<=n;i++) ary[i].val=val;
sort(ary+1,ary+n+1,cmp);
sum=0.0;
for(i=1;i<=n-k;i++)
{
sum+=ary[i].s*(ary[i].c-ary[i].val);
}
if(sum<0.0) return false;
else return true;
}
int main()
{
double l,r,m,ans;
int i;
while(scanf("%d%d",&n,&k)!=EOF)
{
for(i=1;i<=n;i++) scanf("%lf",&ary[i].s);
for(i=1;i<=n;i++) scanf("%lf",&ary[i].c);
l=0.0,r=1000.0;
while(r-l>eps)
{
m=(l+r)/2.0;
if(judge(m))
{
ans=m;
l=m;
}
else
{
r=m;
}
}
printf("%.6f\n",ans);
}
return 0;
}