题目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 |