题目大意是说:有m台机器,每台机器都有一定数量的候选设备,有两个属性:bandwidth和price。求出所有机器中的bandwidth最小值为B,price的和为P,则要求B/P最大。
问题的突破点在于bandwidth,即要B/P最大,又要是所有机器中bandwidth的最小值。可以根据这个条件,对所有bandwidth进行枚举,不满足所有机器中的最小值则去掉。满足条件的则贪心对price进行选择,即求price最小的(不违反贪心原则,因为此时bandwidth是确定的)。之后得出结果,代码如下:
#include<algorithm>
#include<stdio.h>
struct manu{
int band;
int price;
};
manu Manu[101][101];
int mm[101];
int band[101*101];
double maxBP;
int main(){
int n,m;
scanf("%d",&n);
while(n != 0){
scanf("%d",&m);
int bp = 0;
for(int i =0;i<m;i++){
scanf("%d",&mm[i]);
for(int j =0;j<mm[i];++j){
scanf("%d%d",&Manu[i][j].band,&Manu[i][j].price);
band[bp++] = Manu[i][j].band;
}
}
maxBP = 0.0;
for(int i = 0;i<bp;++i){
double sum =0.0;
bool flag = false;
for(int j = 0;j<m;++j){
int minp = 0xffff;
for(int k =0;k<mm[j];++k){
if(Manu[j][k].band >= band[i] && Manu[j][k].price < minp)
minp = Manu[j][k].price;
}
if(minp == 0xffff){
flag = true;
break;
}
sum += minp;
}
if(!flag && ((band[i]*1.0)/sum>maxBP) )
maxBP = band[i]*1.0/sum;
}
printf("%.3f\n",maxBP);
n--;
}
return 0;
}
之前写的是一个回溯版本的,后来为了更快改成循环了,貌似就快了40MS..在博客上看到 别人写的简略代码,差距很大。