CodeM2017初赛C.倒水


辣鸡蒟蒻继续更QwQ


题目大意

有一个大水缸,里面水的温度为T单位,体积为C升。另有n杯水(假设每个杯子的容量是无限的),每杯水的温度为t[i]单位,体积为c[i]升。
现在要把大水缸的水倒入n杯水中,使得n杯水的温度相同,请问这可能吗?并求出可行的最高温度,保留4位小数。
注意:一杯温度为t1单位、体积为c1升的水与另一杯温度为t2单位、体积为c2升的水混合后,温度变为(t1*c1+t2*c2)/(c1+c2),体积变为c1+c2。

输入描述:

#include <bits/stdc++.h>
using namespace std;
const double mii=0.00001;
int n;
double T,C,t[100010],c[100010],mi=10000.0,ma;
bool flg,flgb;
bool check(double target)
{
    double tmp=0;
    for(int i=1;i<=n;++i) tmp+=(t[i]-target)*c[i]/(target-T);
    if(tmp-C>mii) return false;
    return true;
}
double bifind()
{
    double l=mi,r=ma,mid;
    while(r-l>mii)
    {
        mid=(l+r)/2;
        if(check(mid)) l=mid;
        else r=mid;
    }
    return (l+r)/2;
}
int main()
{
    scanf("%d%lf%lf",&n,&T,&C);
    for(int i=1;i<=n;++i)
    {
        scanf("%lf%lf",t+i,c+i);
        if(c[i]<mii) t[i]=T;
        mi=min(mi,t[i]);
        ma=max(ma,t[i]);
    }
    if(fabs(ma-mi)<mii&&fabs(ma-T)<mii) {printf("Possible\n%.4lf",T);return 0;}
    if(T<mi)
    {
        if(check(mi)) printf("Possible\n%.4lf",mi);
        else printf("Impossible");
        return 0;
    }
    if(T>ma)
    {
        mi=ma,ma=T;
        printf("Possible\n%.4lf",bifind());
        return 0;
    }
    printf("Impossible");
    return 0;
}
注意这里我们还有几个特殊情况,但是这些情况都是Impossible,此时直接输出Impossible即可。

声明:TonyZhao's Home|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - CodeM2017初赛C.倒水


不骗了,不骗了。
A Simple OIer fighting tooth and nail.