题意:给 n 个分数(小于等于1) 和 k 次删除操作,每次操作可以去掉一个分数,求最后留下的分数分子分母各自相加组成的新分数的最大值*100;
分析:设最终的最大新分数是 S,则满足,即删除之后留下的 n-k 个分数组成的值为S,, 那么我们可以二分枚举 S,然后计算 排序,从大到小取出 n-k 个,判断和是否大于等于0即可;
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 1000+10;
const double eps = 1e-7;
int n,k;
int A[N],B[N];
double T[N];
bool cmp(double a,double b){return a>b;}
bool check(double x)
{
for(int i=1;i<=n;i++) T[i]=A[i]-x*B[i];
sort(T+1,T+n+1,cmp);
double sum=0.0;
for(int i=1;i<=n-k;i++) sum+=T[i];
return sum>0.0;
}
int main()
{
while(~scanf("%d%d",&n,&k)&&n+k)
{
for(int i=1;i<=n;i++) scanf("%d",&A[i]);
for(int i=1;i<=n;i++) scanf("%d",&B[i]);
double l=0.0,r=1.1;
while(r-l>=eps){
double mid=(l+r)/2;
if(check(mid)) l=mid;
else r=mid;
}
double ans=(l+r)/2;
printf("%.0f\n",(ans*100));
}
}