POJ-1759-Garland

来源:互联网 发布:系统制作软件 编辑:程序博客网 时间:2024/05/18 01:48

唉,被卡了1个多小时,结果发现是自己多算了一个数,也就是算到n+1了,所以导致一直结果不对。

       思路:根据hn=(hn-1+hm+1)/2-1,那么hn+1=2*hn-hn-1+2,由于题目已经给了h1,那么我们只需要二分h2,然后每次判断是否有小于0的即可

代码:

#include<cstdio>#include<cstring>#include<iostream>using namespace std;const double eps=1e-8;int n;double a;int main(){    while(scanf("%d%lf",&n,&a)!=EOF)    {        double l=0,r=1e13,ans=0;        while(r-l>eps)        {            double mid=(l+r)/2;            double pre1=a,pre2=mid;            bool is=true;            for(int i=2;i<n;i++)            {                double v=pre2;                pre2=2*pre2-pre1+2;                pre1=v;                if(pre2<eps)                {                    is=false;                    break;                }            }            if(is)            {                ans=pre2;                r=mid;            }            else                l=mid;        }        printf("%.2f\n",ans);    }    return 0;}


0 0