Educational Codeforces Round 88 (Rated for Div. 2) C (数论,二分)

https://codeforces.com/problemset/problem/1359/C

在这里插入图片描述

题意

有无限的热水冷水,热水冷水轮流倒,先倒热水,再倒冷水,想要中和出的温度最接近温度t,请问最少倒多少杯水。

思路

先枚举找规律:

  1. 第一杯温度为 h
  2. 第二杯温度为 (h + c)/ 2
  3. 第三杯温度为 (2*h + c)/ 3
  4. 第四杯温度为 (2h + 2c)/ 4 =(h + c)/ 2
  5. 第五杯温度为 (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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值