杭电2570

来源:互联网 发布:淘宝上靠谱的翡翠店 编辑:程序博客网 时间:2024/06/05 10:37

这是一个十足的水题。下面只简单说一下具体的过程。

他的大意是要求你用不同的药水配置解药,配出来的浓度不能大于他给出来的浓度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;