程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu 2289 Cup (二分法)

hdu 2289 Cup (二分法)

編輯:C++入門知識

 

二分法解題。
這個題很惡心。。。一開始測試樣例都不能過,這個π一開始取3.1415926結果是99.999026,改為3.1414927,結果是99.999023。。我就發現這個π對結果影響很大,這個題對π的精度要求也比較高。。。然後我的π就改為3.1415926536。。。
一開始判斷跳出二分的條件是結果差值小於0.000000001,發現超時,改為0.01後還是超時。。。無語了。。。然後仔細想想,題目要求結果只要保留小數點6位,所以我就改了判斷跳出循
環的條件,改為二分後的結果和前一次的結果差值不大於0.000001就行了。。。。


AC代碼:

#include<iostream>
#include<cstdio>

#define pai 3.1415926536

using namespace std;

int main()
{
    int t;
    double r,R,h,v,vol,nowh,left,right,nowr,lasth;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lf%lf%lf%lf",&r,&R,&h,&v);
        lasth = left = 0.0;
        right = h;
        while(1)
        {
            nowh = (left+right)/2;
            if(lasth<nowh)
            {
                if(nowh-lasth<0.0000001)   //判斷當前值和上一次的值差值是否小於0.000001,是則退出
                {
                    break;
                }
            }
            else
            {
                if(lasth-nowh<0.0000001)
                {
                    break;
                }
            }
            nowr = nowh*(R-r)/h+r;
            vol = pai*nowh*(r*r+nowr*r+nowr*nowr)/3;
            if(vol>v)
            {
                right = nowh;
            }
            else
            {
                left = nowh;
            }
            lasth = nowh;   //記錄上次的值
        }
        printf("%.6lf\n",nowh);
    }

    return 0;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved