Dropping tests_0 1分数规划

http://poj.org/problem?id=2976

#include <cstdio>
#include<vector>
#include<iterator>
#include<queue>
#include<algorithm>
#include<functional>
using namespace std;
typedef long long ll;
ll a[1010];
ll b[1010];
double d[1010];
int n, k;
double eps=1e-6;
bool check(double L)
{

   for(int i=1;i<=n;i++)
   {
       d[i]=1.0*a[i]-1.0*L*b[i];
   }
   sort(d+1,d+n+1,greater<double> () );
   double sum=0;
   for(int i=1;i<=n-k;i++)
   {

       sum+=d[i];
   }
   if(sum>=0) return true;
   else return false;

}
int main()
{
    while(scanf("%d%d",&n,&k)!=EOF)
    {
        if(n==0) break;
        for(int i=1;i<=n;i++)
        {
            scanf("%lld",a+i);
        }
        for(int i=1;i<=n;i++)
        {

            scanf("%lld",b+i);
        }
        double Max=-1;
        for(int i=1;i<=n;i++)
        {

            Max=Max>(1.0)*a[i]/b[i]?Max:(1.0)*a[i]/b[i];
        }
        double l=0,r=Max,mid,curr=0;
        while(r-l>eps)
        {
            mid=(l+r)/2;
            if(check(mid))
            {
                curr=mid;
                l=mid;
               // printf("%lf",curr);
            }
            else r=mid;

        }
        printf("%.0f\n",100*curr);

    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容