/*poj 1018*/
#include <iostream>
//#include <fstream>
#include <algorithm>
#include <iomanip>
using namespace std;
#define SIZE 103
#define mmax(a,b) (a>b)?a:b
typedef struct _node
{
int _b;
double _p;
}node;
int cmp(const void *a,const void * b);
node a[SIZE][SIZE];
int b[SIZE*SIZE];
int size[SIZE]; //每一行的设备的个数
int maxb[SIZE];
//fstream fin;
int main()
{
//fin.open("1018.txt",ios::in);
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int i,j,k;
int count=0;
memset(maxb,0,sizeof(maxb[0])*SIZE);
for(i=0;i<n;i++)
{
int t;
cin>>t;
size[i]=t;
for(j=0;j<t;j++)
{
cin>>a[i][j]._b>>a[i][j]._p;
b[count++]=a[i][j]._b;
maxb[i]=mmax(a[i][j]._b,maxb[i]);
}
}
//qsort
qsort(b,count,sizeof(b[0]),cmp);
double sum,max,temp;
sum=max=temp=0;
bool flag=false;
for(i=0;i<count-n+1;i++)
{
sum=0;
for(j=0;j<n;j++)
{
if(b[i]>maxb[j])
{
flag=true;
break; //剪枝很大
}
double min=100000; //INL
for(k=0;k<size[j];k++)
{
if(a[j][k]._b>=b[i]&&min>a[j][k]._p)
min=a[j][k]._p;
}
sum+=min;
}
if(flag)
break;
temp=b[i]*1.0/sum;
if(max<temp)
max=temp;
}
cout<<fixed<<setprecision(3)<<max<<endl;
//printf("%.3lf\n",max);
}
system("pause");
return 0;
}
int cmp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
poj 1018
最新推荐文章于 2019-09-04 16:50:59 发布