题目大意:一批长度不等的棍子,要把他们分成一定数量等长的棍子,这些等长的棍子最多可以有多长?
注意事项:
1、二分搜索,这里是找出满足条件的最大的那个。而这里是用二分搜索来不断缩小区间的方法来加速枚举,由于在judge函数中,当满足条件sum >= K时返回的是true,而那个最优解肯定会是mid中记录的,而再一次进入while的时候,l = mid + 1了,所以最终退出循环的时候,r肯定比l要小1,所以r就是所要求的那个值了。
2、bool judge(int t)这个函数中,t在函数中做了除数,所以得特别小心,因为这里,我runtime error了好多次!
Runtime Error这个错误不一定是由于数组越界产生的,还可能是由于除数为0产生的。谨记!!!!!
/* Poj 1064, wrote by Dream Chen 2010/12/12*/
#include <iostream>
#include <string>
using namespace std;
int N = 0;
int K = 0;
int l = 0;
int r = 0;
int mid = 0;
int a[11000];
int res = 0;
bool judge(int t);
int main(void)
{
//freopen("input.txt","r",stdin);
memset((void*)a,0,sizeof(a));
while(EOF != scanf("%d %d",&N,&K))
{
l = 0;r = 0;
for (int i = 0; i < N; ++i)
{
double tmp = 0;
scanf("%lf",&tmp);
a[i] = (int)(tmp*100);
if (a[i] > r)
{
r = a[i];
}
}
while(l <= r)
{
mid = (l + r) / 2;
// suit the requiment
if (judge(mid))
{
l = mid + 1;
}
else
{
r = mid - 1;
}
}
printf("%.2lf/n",r*0.01);
}
return 0;
}
bool judge(int t)
{
int sum = 0;
// Be careful here!!! You runtime error so many times becauce of t == 0
if (t == 0)
{
return true;
}
for (int i = 0; i < N; ++i)
{
sum += a[i] / t;
}
if (sum >= K)
{
return true;
}
else
{
return false;
}
}