这是一个十足的水题。下面只简单说一下具体的过程。
他的大意是要求你用不同的药水配置解药,配出来的浓度不能大于他给出来的浓度w,
很容易就想到只要比w小或等于的都是可以的。然后在考虑大于的情况,很明显我们要从小到大考虑,小的不行大的肯定是不行的。
那么我们就可以将之排序,从小到大。只要是小于的都可以相互配置溶在一起。至于大于的就讨论可以的话就用不行的话就break(后面的就更不可能了)。
#include<iostream> using namespace std; #include<iomanip> #include<cstdlib> int cmp(const void *a,const void *b) { return *(int*)a-*(int*)b; } int main() { int a[105]; int N,V,W,n,k,sum,i; double s; cin>>N; while(N--) { sum=0; k=0; s=0; cin>>n>>V>>W; for(i=0;i<n;i++) cin>>a[i]; qsort(a,n,sizeof(a[0]),cmp); 这里为了省事采用快排 for(i=0;i<n;i++) { if(a[i]<=W) 这里是只要小于等于就可以 { sum+=V; k+=a[i]; 这是所有浓度的和 s=(double)k/(i+1); } else { if(((double)k+a[i])/(i+1)<=W) 这里的判断将大于的倒入小于等于的是否可以,注意这里一定要类型转换。 { s=((double)k+a[i])/(i+1); k+=a[i]; sum+=V; } else break; } } s=s/100; cout<<sum<<" "; cout<<fixed<<setprecision(2)<<s<<endl; } return 0;