题目1435:迷瘴
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int medi[105];
int main(){int t;scanf("%d",&t);while(t--){int n,v,w;int result_v=0;double medicine=0.0,result_p=0.00;memset(medi,0,sizeof(medi));scanf("%d%d%d",&n,&v,&w);double dou_w=w/100.00;for(int i=0;i<n;i++){scanf("%d",&medi[i]);}sort(medi,medi+n);for(int i=0;i<n;i++){result_v+=v;medicine+= medi[i]/100.0*v;//药的剂量 double concen=medicine/result_v;if(concen<dou_w||fabs(concen-dou_w)<1e-8){//两浮点数比较相等的 情况比较特殊 result_p=concen;} else{result_v-=v;break;} }printf("%d %.2f\n",result_v,result_p);}return 0;
}
思路:
既然本题关注的点是:使得体积最大化。所以我们在选择解药的时候,优先选择浓度低的。
tips:
在进行浓度判断时,是将两个double 类型数据放在一起判断。double类型数据判断的方式与int 类型数据判断方式不一样。
输入整数是15,被double类型实际保存为14.999999999999999,然后又有另一个计算得到的15被double变量保存为 15.0000000000001,那么虽然直接比较会得出前者小于后者的情况,但事实上这种不相等是由double的精度损失造成的。
所以在判断两个浮点数是否“相等时”,要使用
if(fabs(a - b) < eps)
。其中,fabs为取绝对值函数,a,b为两个double类型的数,eps为一个很小的浮点数,常取1e-8。
浮点数的比较
| 含义 | 表示 |
|---|---|
| a == b | fabs(a – b) < eps |
| a != b | fabs(a – b) > eps |
| a < b | a – b < -eps |
| a <= b | a – b < eps |
| a > b | a – b > eps |
| a >= b | a – b > -eps |