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