题意:
有一个无限大的容器。你轮流进行如下操作:倒一杯热水进去、倒一杯冷水进去。以此类推。(热水温度是
,冷水温度是
),容器中的水的温度等于倒进去的水的温度总和/倒水的次数。问你需要进行多少次操作,水的温度才能最接近温度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;
}