二分法解題。
這個題很惡心。。。一開始測試樣例都不能過,這個π一開始取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; }