题目大概意思是:给你N个长度的电缆,需要你编写程序 将它分割成 K 根长度相等的小电缆。而我们的目的就是要求出分割出的 最大长度 可以为多少。此处可以应用二分搜索的知识来实现查找最终长度。
代码实现
#include <cstdio> #include <cmath> using namespace std; int N,K; double L[10010]; const int INF = 1e5+10; bool C(double x){ int num=0; for(int i=0;i<N;i++){//统计以长度为x的分法可以分割出的电缆数目 num+=L[i]/x; } return num>=K;//如果可以分割出大于或等于K数目的电缆,那么就返回true } void solve(){ double lb=0,ub=INF; for(int i=0;i<100;i++){ double mid=(lb+ub)/2; if(C(mid)){//如果此时mid分割出的电缆数符合条件,那么就朝着更长的方向去进行分割 lb=mid; }else{//否则,说明以mid为长度不能分割出K跟电缆,那么需要以更小的长度进行分割 ub=mid; } } printf("%.2f\n",floor(ub*100)/100); //floor()函数实现向下取整,具体用法请见https://blog.csdn.net/dangzhangjing97/article/details/81279862 } int main(){ while(~scanf("%d%d",&N,&K)){ for(int i=0;i<N;i++){ scanf("%lf",&L[i]); } solve(); } return 0; }