此题是一个简单的贪心算法,首先要将所有的浓度进行升序排列,然后将浓度小于指定浓度的药水直接全部加起来。浓度大于制定浓度的药水则需要计算看浓度是否超过制定的浓度。值得注意的是在比较浓度的时候涉及到了double 类型和 int 类型的比较问题,double和int类型之间不能直接比较,还需要将两者做差之后和零比较才能准确的得到结果。
#include<iostream>
#include<algorithm>
using namespace std;
int concen[102];
bool cmp_con(int a,int b)
{
return a<b;
}
int main()
{
int C;
scanf("%d",&C);
while(C--)
{
int n,V,W;
scanf("%d%d%d",&n,&V,&W);
for(int i=0;i<n;i++)
scanf("%d",&concen[i]);
sort(concen,concen+n,cmp_con);
double l=0;int vz=0;
for(int i=0;i<n;i++)
{
if(concen[i]<=W)
{
vz+=V;
l+=concen[i]*V;
}else{
double li = l+concen[i]*V;
int vzo = vz+V;
//printf("%lf\n",li/vzo*100);
double non=li/vzo;
//printf("cha= %.15lf\n",non);
if(non-W>0)
break;
else
{
l = li;
vz = vzo;
}
}
}
if(vz==0)
printf("0 0.00\n");
else
printf("%d %.2lf\n",vz,l/vz/100);
}
return 0;
}