【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;
}
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号