POJ-2976-Dropping tests

来源:互联网 发布:怎样删除kingroot软件 编辑:程序博客网 时间:2024/06/05 21:14

这个题的话贪心+二分,设最后的结果k,那么(a1+a2+a3+.....)/(b1+b2+b3+....)=k,转换一下(a1-k*b1)+(a2-k*b2)+......=0,那么可以知道我们任取k个差值要尽量大才行,那么也就是说若后面我们的结果是大于0的,那么我们肯定可以找到更大的值满足要求。剩下的就简单了。

代码:

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int maxn=1100;const double eps=1e-6;int n,k,a[maxn],b[maxn];double c[maxn];int main(){    while(scanf("%d%d",&n,&k)&&(n+k))    {        for(int i=0;i<n;i++)            scanf("%d",&a[i]);        for(int i=0;i<n;i++)            scanf("%d",&b[i]);        double l=0.0,r=1.0;        while(r-l>eps)        {            double mid=(l+r)/2;            for(int i=0;i<n;i++)                c[i]=a[i]-mid*b[i];            sort(c,c+n);            double sum=0;            for(int i=k;i<n;i++)                sum+=c[i];            if(sum>=0)                l=mid;            else                r=mid;        }        printf("%.0f\n",100*l);    }    return 0;}


0 0
原创粉丝点击