题目链接:点击打开链接
有n段绳子,给定n段绳子的长度,单位为厘米。求能够把这些绳子分成k段的最长的段的长度。题目中的trick是最小是1cm,长度不能小于1cm,因此要转换成int来解,然后二分可以截得的绳子的长度。
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
#define INF 100000000
int l[10009];
int n, k;
bool C(int len)
{
if (len == 0) return false;
int sum = 0;
for (int i=0; i<n; i++)
{
sum += (int)(l[i] / len);
}
if (sum >= k) return true;
return false;
}
int main()
{
cout.precision(2);
while ( cin >> n >> k )
{
double x;
for (int i=0; i<n; i++) { cin >> x; l[i] = x * 100; }
int low = 0, up = INF;
for (int i=0; i<100; i++)
{
int mid = (low + up) / 2;
if (C(mid)) low = mid;
else up = mid;
}
if (low < 1) puts("0.00");
else cout << fixed << low * 1.0 / 100 << endl;
}
return 0;
}

解决一个绳子分段问题,给定n段不同长度的绳子,目标是将这些绳子分割成k段,每段长度至少为1厘米,找出最长的可能长度。通过将长度单位转换为整数并采用二分查找算法确定最优解。
276

被折叠的 条评论
为什么被折叠?



