hdu1551

来源:互联网 发布:小米平板1刷windows 编辑:程序博客网 时间:2024/05/29 19:44

这也是一道纯粹的二分数学, 他就是要求你将已知的N个数字,分成F份,那么最大的数据是多少,我最开始理解为最大的削减数据,没想到数据例子一样就WA了,最后才知道是分的数据的最大值。我们想你想要分成F份,就要知道每一份是多少?因为如果你把4.3分成2份每一份是2.0那么剩下的0.3就不能要了, 所以说这个2.0是单位数据,我们要求的就是他。用二分逼近就可以求得每一份的数据:还有就是他的数据最大就是每一份的总和除以F的数值,上限就从这里就可以了,不要从很大开始,如果数据卡的死还是有可能TLE的。还有就是他说了每一份必须大于0.01否则输出0.00,那就不需要二分了。

#include<iostream>
using namespace std;
#include<stdio.h>
#include<cmath>
double a[10005];
int main()
{
    int n,k;
    int i,j,num;
    double sum;
    double t;
    while(cin>>n>>k,n||k)
    {
        num=0;
        sum=0;
        for(i=0;i<n;i++)
        {
            scanf("%lf",&a[i]);
            sum+=a[i];
        }
     sum=sum/k;
     if(sum<0.01*k){cout<<"0.00"<<endl;continue;}
     double low=0.01;
     double high=sum;
     double mid=(low+high)/2;
     while(high-low>1e-8)
     {
         num=0;
         for(i=0;i<n;i++)
            num+=(int)(a[i]/mid);
            if(num<k)high=mid-1e-8;
            else low=mid+1e-8;
            mid=(low+high)/2;
     }
     //cout<<mid<<endl;
     printf("%.2lf\n",mid);
    }
    return 0;
}


0 0
原创粉丝点击