首页 > 代码库 > 第三章 poj 1064

第三章 poj 1064

#include <iostream>#include <cmath>#include <cstdio>using namespace std;const int maxn=10000;const double eps=0.00001;double Len[maxn];int n,k;double Max;bool Right(double len){	int ans(0);	for (int i=0;i<n;i++)	{		ans+=(int)(Len[i]/len);	}	if (ans>=k)		return true;	else		return false;}bool Bigger(double a,double b){	if (a-b<=eps)		return true;	else		return false;}void Init(){	cin>>n>>k;	for (int i=0;i<n;i++){		scanf("%lf",&Len[i]);		Max=max(Max,Len[i]);	}}int main(){   // freopen("a.txt","r",stdin);    Init();    double ln(0),rn(Max);    for (int i=1;i<=100;i++)    {        double mid=(ln+rn)/2;        if (Right(mid))        {            ln=mid;        }        else        {            rn=mid;        }    }    rn=(rn+ln)/2;    printf("%.2f\n",floor(rn*100)/100);}

  

上面的代码和下面的代码仅仅在二分判断退出的地方不同,但是上面的却是WA,下面的AC。

 

#include <iostream>#include <cstdio>#include <string>#include <sstream>#include <cmath>using namespace std;const int maxn=10000;const double eps=0.001;double Len[maxn];int n,k;double Max;bool Right(double len){	int ans(0);	for (int i=0;i<n;i++)	{		ans+=(int)(Len[i]/len);	}	if (ans>=k)		return true;	else		return false;}void Init(){	cin>>n>>k;	Max=0;	for (int i=0;i<n;i++)    {        scanf("%lf",&Len[i]);        Max=max(Max,Len[i]);    }}int main(){    //freopen("a.txt","r",stdin);    Init();    double ln(0),rn(Max);    for (int i=1;i<=100;i++)    {        double mid=(ln+rn)/2;        if (Right(mid))        {            ln=mid;        }        else        {            rn=mid;        }    }    rn=(rn+ln)/2;    printf("%.2f\n",floor(rn*100)/100);}

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

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

第三章 poj 1064