P1577 切绳子
解题思路
这道题目要求将N条绳子切割成K条长度相同的绳子,求每条绳子的最大可能长度。这是一个典型的二分查找问题,我们需要找到满足条件的最大切割长度。
方法思路
-
二分查找:在可能的最大长度范围内进行二分查找
-
精度处理:将长度转换为整数处理以避免浮点数精度问题
-
检查函数:对于每个中间值,检查是否能切割出足够数量的绳子
代码注释
#include<bits/stdc++.h> using namespace std; const int N = 1e5 + 10; int a[N]; // 存储绳子长度(已转换为整数) int n,m; // n-绳子数量,m-需要切割的绳子数量 int L,R; // 二分查找的左右边界 // 检查函数:判断当前长度mid是否能切割出至少m条绳子 bool check(int mid) { if(mid == 0) return 1; // 特殊情况处理 int sum = 0; // 统计能切割出的绳子数量 for(int i = 1; i <= n; i++) sum += a[i] / mid; // 计算每条绳子能切割出的数量 if(sum >= m) return 1; // 满足条件 else return 0; // 不满足条件 } int main() { cin >> n >> m; // 读取绳子数量和需要切割的数量 for(int i = 1; i <= n; i++) { double x; cin >> x; // 读取绳子长度(浮点数) a[i] = int(x * 100); // 转换为整数(保留2位小数) R = max(a[i],R); // 更新右边界(最大长度) } int ans; // 存储最终答案 // 二分查找过程 while(L <= R) { int mid = (L + R) / 2; // 计算中间值 if(check(mid)) // 检查是否满足条件 { ans = mid; // 更新答案 L = mid + 1; // 尝试更大的长度 } else R = mid - 1; // 尝试更小的长度 } printf("%.2f",ans / 100.0); // 输出结果(转换回浮点数) return 0; }

浙公网安备 33010602011771号