https://codeforces.com/problemset/problem/1359/C
题意
有无限的热水冷水,热水冷水轮流倒,先倒热水,再倒冷水,想要中和出的温度最接近温度t,请问最少倒多少杯水。
思路
先枚举找规律:
- 第一杯温度为 h
- 第二杯温度为 (h + c)/ 2
- 第三杯温度为 (2*h + c)/ 3
- 第四杯温度为 (2h + 2c)/ 4 =(h + c)/ 2
- 第五杯温度为 (3h + 2c)/ 5
可以看出偶数杯温度都为(h + c)/ 2
奇数杯温度总是大于(h + c)/ 2
所以当 t <= (h + c) / 2 时,直接输出2即可
当 t > (h + c) / 2 时,使用二分法
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 10;
int h,c,t;
double work(int x){
return (x * h + (x - 1) * c)*1.0 / (2 * x - 1);
}
signed main()
{
int T;
cin >> T;
while (T--){
cin >> h >> c >> t;
if (t <= (h+c)/2.0) cout << 2 << "\n";
else{
int l = 1, r = 1e9;
while (l < r){
int mid = (l + r + 1) >> 1;
if (work(mid) > t) l = mid;
else r = mid - 1;
}
if (fabs(work(l) - t) <= fabs(work(l+1) - t))
cout << 2*l - 1 << "\n";
else cout << 2*l + 1 << "\n";
}
}
return 0;
}