Divide and Conquer:Cable Master(POJ 1064)

时间:2023-12-12 14:48:38

                Divide and Conquer:Cable Master(POJ 1064)

                 缆绳大师

  题目大意,把若干线段分成K份,求最大能分多长

  二分法模型,C(x)就是题干的意思,在while那里做下文章就可以了,因为这个题目没有要求长度是整数,所以我们要不断二分才行,一般50-100次就可以了,精度足够了

  最后要注意,这一题有四舍五入的陷阱,最好用floor处理一下

  

 #include <iostream>
#include <algorithm>
#include <functional>
#include <math.h>
#define MAX 1000000 using namespace std; static double s_set[]; bool C(const double, const int, const int); int main(void)
{
int string_sum, cnt;
double lb, rb, mid; while (~scanf("%d%d", &string_sum, &cnt))
{
for (int i = ; i < string_sum; i++)
scanf("%lf", &s_set[i]);
lb = ; rb = MAX; for (int i = ; i < ; i++)//50的精度已经足够了
{
mid = (lb + rb) / ;
if (C(mid, string_sum, cnt))
lb = mid;
else
rb = mid;
}
printf("%.2f\n", floor(mid * ) / );//防止四舍五入
} return ;
} bool C(const double cut, const int string_sum, const int K)
{
int tmp_sum = ;
for (int i = ; i < string_sum; i++)
tmp_sum += (int)(s_set[i] / cut); return tmp_sum >= K;
}

Divide and Conquer:Cable Master(POJ 1064)