首先,把所有元素按照带宽从小到大排序,然后枚举每一个带宽,并把它当做所选带宽中的最小值。
#include <iostream>
#include<cstring>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#define INF 100000000
using namespace std;
typedef struct{
int group;
double b,p;
}device;
device de[10010];
int num[110],re[110];
double mini[110];
int cmp(const void * x,const void * y){
return((*(device *)y).b>(*(device *)x).b)?-1:1;
}
int main()
{
int t,ok;
double min_b;
double sum;
scanf("%d",&t);
while(t--){
int n; //n组设备
scanf("%d",&n);
int count=0;
double ans=0;
for(int i=1;i<=n;i++){
scanf("%d",&num[i]); //记录每组设备有多少个
mini[i]=INF; //记录每组满足情况的最小价格
for(int j=1;j<=num[i];j++){
double temp_1,temp_2;
scanf("%lf %lf",&temp_1,&temp_2);
de[count].group=i; //第几组
de[count].b=temp_1; //带宽
de[count++].p=temp_2; //价格
}
}
int len=count;
qsort(de,len,sizeof(device),cmp);
for(int i=0;i<len;i++){
min_b=de[i].b; //最小的带宽
memset(re,0,sizeof(re));
sum=0;
ok=1; //每一组都有满足情况的
re[de[i].group]=1;
for(int m=1;m<=n;m++)
mini[m]=INF;
mini[de[i].group]=de[i].p;
for(int j=1;j<len;j++){
if(de[j].group!=de[i].group&&de[j].b>=min_b&&de[j].p<mini[de[j].group]) {
re[de[j].group]=1;
mini[de[j].group]=de[j].p; //记录每一组价格最小值
}
}
for(int k=1;k<=n;k++){
sum+=mini[k];
if(re[k]==0) {
ok=0;
sum=-1;
break;
}
}
if(ok==1&&(min_b/sum)>ans){
ans=min_b/sum;
}
if(ok==0) break;
}
double temp=ans*1000+0.5;
if(temp-floor(temp)<0) ans+=0.001;
printf("%.3lf\n",ans);
}
return 0;
}