CodeM 倒水

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

输入描述:

第一行一个整数n, 1 ≤ n ≤ 10^5
第二行两个整数T,C,其中0 ≤ T ≤ 10^4, 0 ≤ C ≤ 10^9
接下来n行每行两个整数t[i],c[i]
0 ≤ t[i], c[i] ≤ 10^4

输出描述:

如果非法,输出“Impossible”(不带引号)否则第一行输出“Possible"(不带引号),第二行输出一个保留4位小数的实数表示答案。

样例解释:往第二杯水中倒0.5升水
往第三杯水中到1升水
三杯水的温度都变成了20
思路:

如果水缸中的水温在minT和maxT之间,则怎么加水都不能使得n杯水的温度相同。否则计算当使得温度相同的时候需要多少升温度为T的水,判断需要的升数是否小于C。
因为要求出可行的最高温度,在T>maxT时,水缸中的水会全部倒完。最后保留4位小数,JavaScript中需要将输出数据处理为字符串,适当在末尾添加0。

JavaScript:

function printlFor4(value)
{
    var va=value.toFixed(4)+'';
    var vaArr=va.split(".");
    if(vaArr.length==1)
    {
        print(vaArr[0]+'.0000');
    }
    else
    {
      for(var fix=0;fix<4-vaArr[1].length;fix++)
      {
          va=va+'0';
      }
      print(va);
    }
}
var n=parseInt(readline());
var lines=readline().split(' ').map(function(item){return Number(item)});
var T=lines[0];var C=lines[1];
var i=0;
var tArr=[];
var cArr=[];
for(i=0;i<n;i++)
{
    lines=readline().split(' ');
    tArr.push(Number(lines[0]));
    cArr.push(Number(lines[1]));
}
var minT=Math.min.apply(null,tArr);
var maxT=Math.max.apply(null,tArr);
if(minT==maxT)
{
    print("Possible");
    printlFor4(maxT);
 
}
else if(minT<=T&&T<=maxT)
{
    print("Impossible");
}
else
{
     var gree=maxT;
     if(T<minT)
         gree=minT;
      var count=0;
      for(i=0;i<n;i++)
      {
          var cTemp=(cArr[i]*(gree-tArr[i]))/(T-gree);
          count+=cTemp;
      }
      if(count<=C)
      {
          print("Possible");
          if(gree==maxT)
          {
              var sumT=0;
              var sumC=0;
              for(i=0;i<n;i++)
              {
                  sumT+=tArr[i]*cArr[i];
                  sumC+=cArr[i];
              }
              sumT+=T*C;
              sumC+=C;
              gree=sumT/sumC;
          }
          printlFor4(gree);
      }
      else
      {
          print("Impossible");
      }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值