【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 题。。。

image-20200529214611811

赛后找到错的数据之后,在本地测试是对的!我换了一种语言交。

image-20200529214740065

第一发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
");
        	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
",pos+2);
		else printf("%d
",pos);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/valk3/p/12989769.html