news 2026/5/15 9:52:19

AT_abc034_d [ABC034D] 食塩水 题解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AT_abc034_d [ABC034D] 食塩水 题解

AT_abc034_d [ABC034D] 食塩水

Link: https://atcoder.jp/contests/abc034/tasks/abc034_d

题目描述

N NN( 1 ≤ N ≤ 1000 ) (1≤N≤1000)(1N1000)个装有食盐水的容器。容器从1 11N NN标号。第i ii号容器有浓度为p i % p_i\%pi%( 0 ≤ p i ≤ 100 ) (0≤p_i≤100)(0pi100)的食盐水w i w_iwi( 1 ≤ w i ≤ 10 9 ) (1≤w_i≤10^9)(1wi109)克。高桥君需要选择K KK( 1 ≤ K ≤ 1000 ) (1≤K≤1000)(1K1000)个容器,并把选择的容器里的食盐水全部混合在一起。请你编程求出高桥君可以获得的盐水的最大浓度。

输入格式

第一行两个整数N NNK KK
接下来N NN行,每行两个数w i w_iwip i p_ipi

输出格式

一行一个实数x xx,表示高桥君能得到的最大浓度的盐水浓度为x % x\%x%

输入输出样例 #1

输入 #1

3 2 100 15 300 20 200 30

输出 #1

25.000000000

Solution

1. 题意

n nn瓶食盐水,第i ii瓶的浓度为p i p_ipi,质量为w i w_iwi,从中取出k kk瓶,求混合后最大可能的浓度(质量分数)。

2. 分析

需要说明的是,本题提到的浓度从含义上存在一定的不妥。本题的浓度的准确的表述是溶质的质量分数(溶质质量与溶液质量的比值),以下全部使用“质量分数”。

首先是溶液(solution)混合后的溶质质量分数变化关系。如果将质量分别为w 1 ∼ w t w_1\sim w_tw1wt,食盐质量分数分别为p 1 ∼ p t p_1\sim p_tp1pt的溶液混合均匀,那么总体的质量分数是

P = ∑ i = 1 t w i p i ∑ i = 1 t w i × 100 % P=\dfrac{\sum_{i=1}^{t} w_ip_i}{\sum_{i=1}^{t} w_i}\times 100\%P=i=1twii=1twipi×100%

也即选定的这些盐水质量分数的加权平均值。权重的存在使得我们需要在“提高溶质含量”和“减小溶液质量”二者之间找到一个平衡点。因此“直接选择前k kk个最浓的盐水”是最常见的错误思路。

这题我们考虑使用二分法求解。我们设目标质量分数为p target p_\text{target}ptarget,那么对于选定的k kk份盐水而言,每一份都会对这个目标值产生一定的贡献(contribute),如果这份盐水的质量分数高于目标,则贡献为正(因为加进去后一定会让质量分数提升),否则为负(加进去后就拖了后腿),而盐水的质量就是权重(很明显质量越大越有影响力)。

因此某一份盐水对质量分数的提升的贡献w i ( p i − p target ) w_i(p_i-p_\text{target})wi(piptarget),总体的贡献就是

∑ i = 1 k w i ( p i − p target ) \sum_{i=1}^{k}w_i(p_i-p_\text{target})i=1kwi(piptarget)

从贪心的角度来讲,若要让总体的质量分数尽可能提高,肯定要优先选择贡献大的。将所有的盐水按照贡献由大到小排序,选出贡献值前k kk大的,如果总体的贡献大于或等于0 00,意味着可以考虑进一步提升,反之则不行。

思路上和 P1570 非常类似。

3. 代码

#include<iostream>#include<vector>#include<algorithm>#include<cmath>usingnamespacestd;classsolution{public:doubleweight;// 质量doubleconcentration;// 质量分数doublecontribute;// 贡献solution(doubleweight=0,doubleconcentration=0):weight(weight),concentration(concentration){}};boolcompare(constsolution&s1,constsolution&s2){returns1.contribute>s2.contribute;}intn,k;solution*containers;inlinedoublestatus_sum(){doubleresult=0;for(inti=1;i<=k;i++)result+=containers[i].contribute;returnresult;}boolavailable(doubletarget){for(inti=1;i<=n;i++)containers[i].contribute=(containers[i].concentration-target)*containers[i].weight;sort(containers+1,containers+n+1,compare);returnstatus_sum()>=0;}intmain(){scanf("%d%d",&n,&k);containers=newsolution[n+10];for(inti=1;i<=n;i++)scanf("%lf%lf",&containers[i].weight,&containers[i].concentration);doubleleft=0.0,right=100.0,middle=50.0;while(fabs(right-left)>=1e-11){middle=(left+right)*0.5;if(available(middle))left=middle;elseright=middle;}printf("%.10lf\n",middle);}

4. Trivia

  • 常温常压(20℃,1 atm)下食盐(主要成分为 NaCl)的溶解度约为 36g/100ml。若认为 100ml 的水的质量为 100g,则常温下氯化钠溶液中氯化钠质量分数不会超过 26.5%;
  • 也就是说常温状态下,样例中出现的 30% 的盐水会发生沉淀如果这样的话也不能叫溶液了)。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/15 9:52:19

终极指南:如何使用SMUDebugTool完全控制AMD Ryzen处理器

终极指南&#xff1a;如何使用SMUDebugTool完全控制AMD Ryzen处理器 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://…

作者头像 李华
网站建设 2026/5/15 9:52:08

CircuitPython ESP32网络编程实战:从Wi-Fi连接到IPv6通信

1. 项目概述如果你正在用ESP32这类物联网开发板做项目&#xff0c;大概率绕不开网络连接。无论是从云端拉取数据&#xff0c;还是给设备推送指令&#xff0c;网络都是现代嵌入式应用的“血管”。过去几年&#xff0c;我经手过不少基于MicroPython和Arduino框架的项目&#xff0…

作者头像 李华
网站建设 2026/5/15 9:52:08

12大衰老标志:脊椎动物最高寿命差100倍+

摘要 现代人类的长寿比例远高于祖先群体,使得那些为青年期优化、却在老年期持续活跃的分子通路产生不良后果。自然选择强度在成年期逐渐减弱,形成「选择阴影」:晚期有害突变在此区域累积,而具备青年期优势的等位基因即便在晚年产生代价也能得以保留。进化视角有助于理解一…

作者头像 李华
网站建设 2026/5/15 9:52:06

Acton金丝雀发布:渐进式发布方案

Acton金丝雀发布&#xff1a;渐进式发布方案 【免费下载链接】acton Toolchain for TON smart contract development and beyond 项目地址: https://gitcode.com/GitHub_Trending/acto/acton Acton是TON智能合约开发的完整工具链&#xff0c;提供从编译、测试到部署的全…

作者头像 李华
网站建设 2026/5/15 9:45:34

终极苹果面试题指南:1年高频LeetCode题目分类与实战策略

终极苹果面试题指南&#xff1a;1年高频LeetCode题目分类与实战策略 【免费下载链接】LeetCode-Questions-CompanyWise Contains Company Wise Questions sorted based on Frequency and all time 项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Questions-Comp…

作者头像 李华
网站建设 2026/5/15 9:45:33

国产破局,PCM再起航|相变存储器能否扛起SCM的大旗?

1. Intel Optane退场后的存储格局震荡 去年Intel宣布放弃Optane产品线的消息&#xff0c;就像在存储行业扔下了一颗深水炸弹。我当时正在参与一个金融级数据库项目&#xff0c;团队刚把Optane PMem列入技术选型清单&#xff0c;这个突发消息直接打乱了我们的技术路线图。这让我…

作者头像 李华