1 solutions

  • 0
    @ 2026-1-16 16:04:12

    #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