Codeforces 1359 C. Mixing Water(二分)

在這裏插入圖片描述

題意:

有一個無限大的容器。你輪流進行如下操作:倒一杯熱水進去、倒一杯冷水進去。以此類推。(熱水溫度是 hh ,冷水溫度是 cc),容器中的水的溫度等於倒進去的水的溫度總和/倒水的次數。問你需要進行多少次操作,水的溫度才能最接近溫度t。
設倒進冷水的杯數爲 xx ,熱水的杯數爲 x+1x+1 。然後二分杯數,如果 (h(mid+1)+cmid)/(2.0mid+1)>t(h * (mid + 1) + c * mid) / (2.0 * mid + 1) > t說明此時溫度還是較高,那繼續加水可以向 tt 靠近,然後二分出最合適的杯數。然後確定一個範圍枚舉杯數即可。

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章