POJ 1064---二分搜索法
///2.假定一个解并判断是否可行 ///POJ1064 /** Q:有N条绳子,长度分别为Li,从中切割出k条长度相同的绳子, 这K条绳子最长能有多长?保留两位小数 A: 二分搜索模型。 条件C(x):=可以得到K条长度为x的绳子 问题转变为 求满足C(x)的最大x;lb=0 ub=INF 问题转变为 如何高效的判断C(x) 1.二分搜索模型:在求最优解问题上的应用 “求满足条件C(x)的最小x”->若所有的x'>=x也满足C(x),则可用二分搜索来解决 */ #include"iostream" #include "cstdio" #include "cmath" using namespace std; #define MAX 100010 #define INF 0x3f3f3f3f int N,K; double L[MAX]; bool C(double x) { int num=0; for(int i=0;i<N;i++) { num+=(int)(L[i]/x); } return num>=K; } void solve() { ///初始化解的范围 double lb=0.0,ub=INF; ///重复循环,直到解的范围足够小 for(int i=1;i<=100;i++) { double mid=(lb+ub)/2; if(C(mid)) lb=mid;///长度还可以大点 else ub=mid; } printf("%.2f\n",floor(ub*100)/100);///保留两位小数处理,ub代表最大符合 } int main() { while(~scanf("%d%d",&N,&K)) { for(int i=0;i<N;i++) { scanf("%lf",&L[i]); } solve(); } return 0; } /** 4 11 8.02 7.43 4.57 5.39 Sample Output 2.00 */