这也是一道纯粹的二分数学, 他就是要求你将已知的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;
}