1 solutions
-
0

#include<bits/stdc++.h> using namespace std; const double eps=1e-8;//避免浮点误差 int n,l=1/*队首*/,r/*队尾*/; double V/*恒定总体积*/,q1[500010]/*单调队列中每个决策的体积*/,q2[500010]/*单调队列中每个决策的热量*/; double del/*每次倒出的水*/,a1/*倒入水的温度*/,a2/*倒入水的体积*/,sm1/*总体积*/,sm2/*总热量*/; int main() { scanf("%d%lf",&n,&V); for(int i=1;i<=n;i++) { scanf("%lf%lf",&a1,&a2); while(sm1+a2>V)//当前体积加上倒入水的体积大于恒定体积就倒出队头 { del=min(q1[l],sm1+a2-V);//倒出队头,倒不完就只倒一部分 sm1-=del;//减去队头体积 sm2-=del*q2[l];//减去队头热量 q1[l]-=del;//队头体积减去倒掉的部分 if(fabs(q1[l])<eps)//如果队头倒没了就出队 l++; } q2[++r]=a1; q1[r]=a2;//倒入水,入队 sm1+=a2;//更新体积 sm2+=a2*a1;//更新热量 while(l<r&&q2[r-1]>q2[r])//维护单调性 { r--; q2[r]=(q2[r]*q1[r]+q2[r+1]*q1[r+1])/(q1[r]+q1[r+1]);//混合后的队尾温度 q1[r]+=q1[r+1];//混合后的体积 } printf("%.7lf\n",sm2/sm1);//热量÷质量(体积)=温度 } return 0; }
- 1
Information
- ID
- 2820
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 10
- Tags
- # Submissions
- 1
- Accepted
- 0
- Uploaded By