题意:
有一个无限大的容器。你轮流进行如下操作:倒一杯热水进去、倒一杯冷水进去。以此类推。(热水温度是
h
h
h ,冷水温度是
c
c
c),容器中的水的温度等于倒进去的水的温度总和/倒水的次数。问你需要进行多少次操作,水的温度才能最接近温度t。
设倒进冷水的杯数为
x
x
x ,热水的杯数为
x
+
1
x+1
x+1 。然后二分杯数,如果
(
h
∗
(
m
i
d
+
1
)
+
c
∗
m
i
d
)
/
(
2.0
∗
m
i
d
+
1
)
>
t
(h * (mid + 1) + c * mid) / (2.0 * mid + 1) > t
(h∗(mid+1)+c∗mid)/(2.0∗mid+1)>t说明此时温度还是较高,那继续加水可以向
t
t
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;
}