AT2402题解
题意简述
- 给你
杯水,第 杯的水温为 ,容量为 ,依次倒入容量为 的大盆。注意每次倒入水后盆内水的总体积必须恒定为 ,且每杯水必须全部倒入,因此为防止倒进水时溢出,在倒水之前可以从盆里往外倒出一些水。求每次倒进水后盆里水温度的最大值(每次计算时情况独立否则太简单了,不计倒水时的热损耗)。数据保证有解(即每次倒入水时总有办法使盆内水总体积为 )。 ,
题目分析
题意中既要按顺序倒入水又要倒出水,还要不停维护最大值,考虑到较大的数据范围,我们应使用单调队列进行求解。根据题意我们可以维护一些水的决策,具体每个决策有
我们先考虑在“倒进”水之前要“倒出”的水决策。很明显它的
然后我们再考虑倒入水的情况。首先将当前决策入队。由于当前决策的
值得一提的是,我们与其不断计算维护总温度值,不如利用物理学概念:热量
代码实现
#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; }
第一次写 AT 的题解,管理大大就给过了吧
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端