首页 > 其他分享 >AT2402 题解

AT2402 题解

时间:2023-07-09 18:45:08浏览次数:37  
标签:q1 q2 leq 题解 决策 倒入 体积 AT2402

题意简述

  • 给你 \(n\) 杯水,第 \(i\) 杯的水温为 \(t_i\),容量为 \(v_i\),依次倒入容量为 \(V\) 的大盆。注意每次倒入水后盆内水的总体积必须恒定为 \(V\),且每杯水必须全部倒入,因此为防止倒进水时溢出,在倒水之前可以从盆里往外倒出一些水。求每次倒进水后盆里水温度的最大值(每次计算时情况独立否则太简单了,不计倒水时的热损耗)。数据保证有解(即每次倒入水时总有办法使盆内水总体积为 \(V\))。
  • \(1\leq n\leq 5\times 10^5\),\(1\leq V\leq 10^9,0\leq t_i\leq 10^9(1\leq i\leq n),1\leq v_i\leq V(1\leq i\leq n,v_1=V)\)

题目分析

题意中既要按顺序倒入水又要倒出水,还要不停维护最大值,考虑到较大的数据范围,我们应使用单调队列进行求解。根据题意我们可以维护一些水的决策,具体每个决策有 \(v\)(体积)、\(t\)(温度) 两个属性值。

我们先考虑在“倒进”水之前要“倒出”的水决策。很明显它的 \(t\) 一定要尽可能低,否则倒出 \(t\) 更低的决策明显可以使总温度更高,因此更优。从而考虑维护 \(v\) 值单调递增的单调队列。每次“倒入”水(将当前决策入队)之前,为保持总体积恒定,根据“倒入”的水的 \(v\) 值不断“倒出”队头决策(出队),当队头决策无法完全“倒出”(即队头的 \(v\) 过大)时仅“倒出”一部分(保留队头决策,将它的 \(v\) 值减小一部分)。

然后我们再考虑倒入水的情况。首先将当前决策入队。由于当前决策的 \(t\) 值可能小于原来队尾决策的 \(t\) 值,违反了单调性,因此可以通过不停将原队尾与当前决策“混合”,降低队尾的 \(t\) 值,直到满足单调性为止。

值得一提的是,我们与其不断计算维护总温度值,不如利用物理学概念:热量 \(Q=mt\)(此题中是水,我们可以姑且认为 \(v\) 与 \(m\) 等价),这样每次混合水的时候,可以直接得出 \(Q'=Q_1+Q_2\),\(v'=v_1+v_2\),温度则只需要计算 \(t=\frac{Q}{m}\) (此题中也可以表示为\(t=\frac{Q}{v}\)),明显方便许多。

代码实现

#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;
}

标签:q1,q2,leq,题解,决策,倒入,体积,AT2402
From: https://www.cnblogs.com/hadtsti/p/AT2402-solution.html

相关文章

  • P4819 题解
    题意简述\(n\)个居民中有一名杀手,有些居民知道其他一些人的身份是杀手还是平民,该类条件共\(m\)条。现在警方要询问一些居民来获得其他人的信息,要求在能够从已知条件推断出杀手是谁的前提下询问尽可能少的人。然而每个居民是杀手的概率都是\(\frac{1}{n}\),因此警方询问的居民......
  • redis雪崩问题解决
    缓存雪崩出现的场景缓存服务器宕机,没有设置持久化介绍:缓存服务器宕机,没有设置持久化,导致缓存数据全部丢失,请求全部转发到数据库,造成数据库短时间内承受大量请求而崩掉。缓存集中失效缓存的key设置了相同的过期时间,导致在某一时刻,大量的key同时失效,请求全部转发到数据库,造成......
  • gym 102994M Travel Dream 题解
    给定带权无向图,求最大\(k\)元环。\(n,m\leq300,3\leqk\leq10\),无重边。把\(k=3\)判掉,可以\(O(m^2)\)轻松解决。把\(k\)元环拆成长度为\(\dfrac{k}{2}-1\)的链\(+\)长度\(k-\dfrac{k}{2}-1\)的链\(+\)连接两条链的两条边。(长度指边的个数)问题:两条链需要无......
  • 「NOIP 模拟赛 20230709」T3 - 与行星相会 题解
    题目大意原题有一个\(n\timesn\)的点阵,将相邻的点连边得到一个\((n-1)\times(n-1)\)的网格。\(q\)次操作,每次删掉一条边,求删掉后边两端的点是否仍在一个连通块内。强制在线。题解显然,由于对偶图的性质,原图的一个割对应对偶图中的一个环,所以只需要删掉一条边时在对偶图中......
  • 寻找页码题解
    首先看题目,我也不知道这一题的出处。。。。在网上找了很久也没找到。。。题目描述从第1页开始,页码组成的数字序列如下:123..101112..99100101...这串序列又被称之为连写数。给定一个0到9之中的单独一位数字a,请问在这串序列中,第k次出现a,是在哪一页上?以数码1为例,第......
  • 华泰证券FINTECH决赛第二题题解
    被第二题搞得坐牢2个半小时,在最后10分钟才确定推出的求和公式没问题,是除法取模不规范导致求解有偏差,只能说菜是原罪。这里贴一下赛后修改的代码,希望能对列位有些帮助,欢迎巨佬指导。思路:分奇偶讨论固定长度下伪回文串的数量,定义长度为\(n\)的伪回文串的数量为\(a_{n}\):(1)\(n\)......
  • P7112 题解
    题意简述模板题,求一个\(n\timesn(n\le600)\)的方阵的行列式模一个正整数\(p(1\lep\le10^9+7)\)的值(\(p\)不一定是质数)。题目分析这个题的最终代码其实很简单,重点在于过程。说实话,我在做这个题之前也就只知道个行列式的定义,只会暴力硬算。做了这个题才了解了行列式有那......
  • 关于Azure-平台-Redhat-Linux-服务器时间同步的问题解决
    首先说明一下,关于Azure平台中国区,是没有RedhatLinux系统镜像的于是笔者这边是通过在Windows系统 Hyper-V管理器中安装完Redhat8.x操作系统后,最后将系统磁盘转换成转换为VHD格式然后经过一系列操作、最终在Azure平台上形成了自己的并且加固过的RedHatEnterpriseLinuxre......
  • 【题解】 [APIO2007] 动物园
    目录题目链接原题描述题目描述输入格式输出格式样例#1样例输入#1样例输出#1样例#2样例输入#2样例输出#2提示题意概括思路历程1.与环相关2.设计状态代码实现题目链接原题描述[APIO2007]动物园题目描述新建的圆形动物园是亚太地区的骄傲。圆形动物园坐落于太平洋的一个......
  • 洛谷题解——【模板】堆
    题目链接:【模板】堆【模板】堆题目描述给定一个数列,初始为空,请支持下面三种操作:给定一个整数\(x\),请将\(x\)加入到数列中。输出数列中最小的数。删除数列中最小的数(如果有多个数最小,只删除\(1\)个)。输入格式第一行是一个整数,表示操作的次数\(n\)。接下来\(n\)......