題意:
有一個無限大的容器。你輪流進行如下操作:倒一杯熱水進去、倒一杯冷水進去。以此類推。(熱水溫度是 ,冷水溫度是 ),容器中的水的溫度等於倒進去的水的溫度總和/倒水的次數。問你需要進行多少次操作,水的溫度才能最接近溫度t。
設倒進冷水的杯數爲 ,熱水的杯數爲 。然後二分杯數,如果 說明此時溫度還是較高,那繼續加水可以向 靠近,然後二分出最合適的杯數。然後確定一個範圍枚舉杯數即可。
AC代碼:
int T;
double h, c, t;
int main()
{
int T;
sd(T);
while (T--)
{
cin >> h >> c >> t;
double esp = fabs((h + c) / 2 - t);
int l = 0, r = inf, ans = 2;
while (l < r)
{
int mid = (l + r) >> 1;
if ((h * (mid + 1) + c * mid) / (2.0 * mid + 1) > t)
l = mid + 1;
else
r = mid;
}//二分最接近的次數
rep(i, max(0, l - 10), l + 10)
{
double tmp = (h * (i + 1) + c * i) / (2.0 * i + 1);
if (fabs(tmp - t) < esp)
{
ans = 2 * i + 1;
esp = fabs(tmp - t);
}
}
pd(ans);
}
return 0;
}