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; }