zoukankan      html  css  js  c++  java
  • 【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;
    }
    
  • 相关阅读:
    Git CMD
    Guava Cache相关
    137.Single Number II---位运算---《剑指offer》40
    SpringMVC数据绑定
    StringUtils工具类的使用
    sql注入
    mapper配置文件中的动态SQL
    json相关注解和序列化与反序列化
    用户模块
    横向越权与纵向越权
  • 原文地址:https://www.cnblogs.com/valk3/p/12989769.html
Copyright © 2011-2022 走看看