当前位置: 首页 > ops >正文

rqnoj 495 化学课配制溶液

原题: https://www.rqnoj.cn/problem/495

//rqoj495 
//给出不同溶液的浓度Ai和体积Bi,问 最多能配出多大体积的浓度W的溶液。Ai,Bi,Wi由题目给出,均为整数 
//思路:先把所有的溶液浓度由高到低排序,然后把所有的溶液都混合在一起,得到总浓度为C,总体积V三种情况: 
//    ①如果浓度C刚好等于w,即可输出体积
//    ②如果C>W,说明浓度太高,为了使体积减少量最少,我们选择 先去掉浓度最高Ci的溶液ri(设体积为Vi),假设去掉的体积为Vx
//    列出公式有:  C*V - Ci * Vx = Wi*(V-Vx),好好体会这条公式,这是关键。
//    如果求出Vx>Vi,说明去除了所有的Ci溶液还是达不到浓度Wi,我们先去除全部Ci溶液后,再查找下一个
//    如果求出Vx<=Vi,说明去除Vx就可以恰好达到浓度Wi,这时我们用V-Vx,跳出循环。  
//    ③如果C<W,过程则与②相反,先去除浓度最低的溶液..
//注意精度问题,如果浮点数比较大小的表达方式.
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
struct R 
{double vi;//体积 double ci;//浓度 
}r[51];//溶液 
int cmp(R a,R b)//浓度从大到小 
{return a.ci>b.ci;
}
int main()
{int n;while(~scanf("%d",&n)){double sum=0;double v=0;for(int i=0;i<n;i++){scanf("%lf",&r[i].ci);}for(int i=0;i<n;i++){scanf("%lf",&r[i].vi);sum=sum+r[i].ci*r[i].vi;//总溶质 v=v+r[i].vi;//总体积 }sort(r,r+n,cmp);double target;//所需要的目标弄度 scanf("%lf",&target);double now=sum/v;//全部混合在一起的浓度if(now==target){printf("%.5lf\n",v);continue;}else if(now<target){//浓度太低 int i;for(i=n-1;i>=0;i--)//从低浓度额开始减 { double tmp=v*(now-target)/(r[i].ci-target);if(tmp-r[i].vi>0.000001) //浮点数判断大于 {double m=r[i].vi*r[i].ci;sum=sum-m;v=v-r[i].vi;now=sum/v;}else{v=v-tmp;break;}}printf("%.5lf\n",v);}else{int i;for(i=0;i<n;i++)//从高浓度额开始减 {double tmp=v*(now-target)/(r[i].ci-target);if(tmp-r[i].vi>0.000001){double m=r[i].vi*r[i].ci;sum=sum-m;v=v-r[i].vi;now=sum/v;}else{v=v-tmp;break;}}printf("%.5lf\n",v);}}return 0;
}

一开始我的想法是把所有的溶液先混合起来,如果溶度高就去减掉浓度高的溶液,那浓度高的溶液要减掉多少呢,我就去二分找最佳体积了....结果被我搞得好复杂,也过了60的数据.最后没解出来。。。看了评论区之后才明白了正确的思路,以后浓度这些我还是应该冷静下来去推 公式,不要慌。


http://www.xdnf.cn/news/11066.html

相关文章:

  • PPTV去广告-2(去广告补丁的制作-XP测试通过)
  • 常见JS类型转换的方法
  • 不能不读的管理学著作
  • Java Pattern和Matcher用法
  • 工作流-jbpm入门例子
  • 10个最受欢迎的HDR环境贴图下载站
  • 电脑技巧:台式机噪音非常大的几个原因以及解决办法
  • 关于labelme标注线粗细和节点大小问题
  • 钱小样经典语录
  • 【中科院】分子生物学-朱玉贤第四版-笔记-第7-8讲 翻译
  • mysql -a_mysqlda
  • Oracle 9i所有版本的最新下载地址(已验证!)
  • 职场实录:我在盛大的日子
  • 外贸网站显示不安全警告怎么办?消除网站不安全警告超全指南
  • 一个快播倒下去,千千万万个快播站起来
  • 设置导航标题颜色以及导航条背景色
  • 回归线
  • oracle数据库分层,Oracle数据仓库的分层管理器解决方案开发者网络Oracle
  • 关于WindowsMobile6.0 手机系统
  • 深入剖析ARP地址欺骗病毒原理及欺骗过程
  • PHP设置header出现警告headers already sent by (output started at......
  • C/C++ MessageBox() 弹窗的用法
  • 未来宝宝长相预测在线工具好用吗?揭秘宝宝美丽奥秘的工具
  • 大学生网页设计制作作业实例代码 (全网最全,建议收藏) HTML+CSS+JS
  • Dell 服务器安装方法介绍
  • 18个国外优质图片素材
  • 黑客编程hack/黑客入侵用什么编程语言_小白白帽子技巧
  • 黑客是怎么攻击网站的,管理员必知
  • C# Assembly 反射
  • android 推送功能