【CF-1359 C. Mixing Water】二分
C. Mixing Water
题意
现在有两种杯子,一种杯子里是温度为 h 的热水,另一种杯子里是温度为 C 的水,
向一个容量无限大的容器中,依次倒入热水,凉水,热水,凉水.....,问达到最接近
给出的温度 t 的操作次数为多少?
思路
写一下可以知道,所有偶数次的温度是相同的,都是\(\frac{h+c}{2}\)。
而奇数次的温度是依次递减的。次数趋向于无穷时,温度趋向于\(\frac{h+c}{2}\)。
所以我们先判断给出的温度是否小于等于\(\frac{h+c}{2}\),如果小于等于,直接输出2,。
否则,我们二分找到最后一个操作完之后,温度大于等于 t 的次数,判断它
和它的下一个奇数次,那个更接近 t 。
因为之前交题使用了__int128
,所以默认选择的语言是GNU G++17 9.2.0 (64 bit, msys 2)
,
一直WA 4 ,感觉一点问题没有。还影响了我做 D 题。。。
赛后找到错的数据之后,在本地测试是对的!我换了一种语言交。
第一发WA 4 就过了呀,噗。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
typedef long long ll;
typedef unsigned long long ull;
int h,c,t;
double f(int x)
{
int l=x/2+1,r=x/2;
return 1.0*(1LL*l*h+1LL*r*c)/x;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&h,&c,&t);
if(1.0*(h+c)/2 >= 1.0*t)
{
printf("2\n");
continue;
}
int l=1,r=1000000,pos;
while(l<=r)
{
int mid=(l+r)/2;
double now=f(mid*2-1);
if(now>=1.0*t)
{
pos=2*mid-1;
l=mid+1;
}
else r=mid-1;
}
if(abs(f(pos)-1.0*t)>abs(f(pos+2)-1.0*t))
printf("%d\n",pos+2);
else printf("%d\n",pos);
}
return 0;
}