poj 1018 深搜

题意:某公司要建立一套通信系统,该通信系统需要n种设备,而每种设备分别可以有m1、m2、m3、...、mn个厂家提供生产,而每个厂家生产的同种设备都会存在两个方面的差别:带宽bandwidths 和 价格prices。

现在每种设备都各需要1个,考虑到性价比问题,要求所挑选出来的n件设备,要使得B/P最大。其中B为这n件设备的带宽的最小值,P为这n件设备的总价。

分析:

方法一 按带宽升序排序,从小到大枚举dev[]中各个设备的带宽,枚举B值的过程中,若发现B值比某种设备的最大带宽更大,则无需继续枚举。

方法二(最优) 输入时确定最小带宽min和最大带宽max,从min到max枚举带宽i作为最小带宽,每行数据中,找到带宽比i大并且price最小的物品,因为best=i/total_price,i 已经确定,就要使每个price最小

 

 

int a[200],b[150][150][2];
int main(){
    int ii,min,max,mat,t,i,j,n,tot,k;
    double tp;
    cin>>t;
    for(ii=1;ii<=t;ii++) {
        cin>>n;
        min=100000000;
        max=100000000;
        for(i=1;i<=n;i++) {
            mat=0;
            cin>>a[i];
            for(j=1;j<=a[i];j++) {
                cin>>b[i][j][0]>>b[i][j][1];
                if (b[i][j][0]<min) min=b[i][j][0];
                if (b[i][j][0]>mat) mat=b[i][j][0];
            }
            if (max>mat) max=mat;
        }
        tp=0;
        for(i=min;i<=max;i++) {
            tot=0;
            for(j=1;j<=n;j++) { 
                mat=100000000;
                for(k=1;k<=a[j];k++)
                    if (b[j][k][0]>=i&&b[j][k][1]<mat) 
                        mat=b[j][k][1];  
                 tot=tot+mat;
            }
           if (i/(tot+0.0)>tp) tp=i/(tot+0.0);
        }
        cout<<fixed<<setprecision(3)<<tp<<endl;
    }
    return 0;
}

 

posted @ 2013-06-20 19:44  心向往之  阅读(211)  评论(0编辑  收藏  举报