第三章 poj 1064——关于带精度的二分法

/*
  题意:给定n个实数l[i],给定一个k
  问:求最大的ans,使得sum l[i]/ans i=1 to n >=k,且ans最大
*/

#include <iostream> #include <cstdio> #include <cmath> #define range(i,a,b) for (int i=a;i<=b;i++) using namespace std; const int maxn = 10000; int n,k; double l[maxn+1]; double max(double a,double b) { return a>b ? a : b; } bool check(double val) { int ans(0); range(i,1,n) ans += (int)(l[i]/val); return ans>=k; } int main() { double left(0),right(0);//假如这两个定义到全局,则会显示reference to right is ambiguous //注意初始化,left本来是初始化为1的,但是这样是错的因为可能存在小于1的答案 cin>>n>>k; range(i,1,n) { scanf("%lf",&l[i]); right = max(right,l[i]); } range(c,1,1000) { double mid = (left+right)/2; if (check(mid)) { left = mid; } else { right = mid; } } printf("%.2f\n",floor(right*100)/100); return 0; //WA }

 

  进行100次循环,每次二分,精度为lenmax>>100。

      本例中N=10000,所以大概为1*e-27左右吧。

posted on 2014-09-15 09:40  杰斯特丹第  阅读(212)  评论(0编辑  收藏  举报

导航