枚举+贪心,枚举每一个带宽作为最小带宽,然后寻找每一个设备中带宽大于或等于最小带宽但是价格最低 的设备,比较每一次B/P的结果,取最大值 #include<stdio.h> #include<time.h> int bp[105][205]; int price,bandwidth; double max; int sort(int *num) { int i,j; for(i=4;i<=2*num[0];i+=2) { for(j=2*num[0];j>=i;j-=2) { if(num[j]>num[j-2]) { int t=num[j-1]; num[j-1]=num[j-3]; num[j-3]=t; t=num[j]; num[j]=num[j-2]; num[j-2]=t; } } } return 0; } int main() { //freopen("in.txt","r",stdin); //freopen("out1.txt","w",stdout); int cas; scanf("%d",&cas); while(cas--) { int n; scanf("%d",&n); max=0.0; int i,j,k,t; for(i=0;i<n;i++) { scanf("%d",&bp[i][0]); for(j=1;j<=2*bp[i][0];j++) scanf("%d",&bp[i][j]); sort(bp[i]); } for(i=0;i<n;i++) { for(j=1;j<=2*bp[i][0];j+=2) { bandwidth=bp[i][j]; price=bp[i][j+1]; for(k=0;k<n;k++) { int low=100000; if(k==i) continue; for(t=1;t<=2*bp[k][0];t+=2) { if(bp[k][t]>=bandwidth&&bp[k][t+1]<low) low=bp[k][t+1]; if(bp[k][t]<bandwidth) break; } if(low==100000) { bandwidth=0; break; } price+=low; } if(bandwidth/(double)price>max) max=bandwidth/(double)price; } } printf("%.3f/n",max); //printf("%lf/n",(double)clock()/CLOCKS_PER_SEC); } return 0; }