题目意思就是给出n长考试,去掉k场问剩下场次所能达到的最大正确率是多少,
分子分母不存在直接的加和关系,所以这个题直接顺着dp很难做,但是如果把正确率先定下来,我们就可以算出来每场考试的对于达成正确率的贡献,之后去掉贡献最少的k场,就可以判断正确率是否能达到
精度问题不大
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
using namespace std;
int r[2010],tot[2010],n,m;
double a[2010];
bool check(double x)
{
double now=0;
for (int i=1;i<=n;i++) a[i]=r[i]-x*tot[i];
sort(a+1,a+n+1);
for (int i=m+1;i<=n;i++) now+=a[i];
if (now>=0) return true;
return false;
}
int main()
{
while(scanf("%d%d",&n,&m)&&(n!=0||m!=0))
{
for (int i=1;i<=n;i++) scanf("%d",&r[i]);
for (int i=1;i<=n;i++) scanf("%d",&tot[i]);
double l=0,r=1;
while (r-l>0.0001)
{
double mid=(l+r)/2;
if (check(mid)) l=mid;
else r=mid;
}
printf("%.0f\n",l*100);
}
}