题目:
http://poj.org/problem?id=1018
题解:
我们可以枚举每一种B可能的值,然后寻找每一行里大于等于B里最小的P。
代码:
#include<cstdio>
#include<stdlib.h>
struct in
{
double B,P;
}a[101][101];
double b[10001];
int t[101];
int cmp(const void *a,const void *b)
{
in *c=(in*)a;
in *d=(in*)b;
if(c->P>d->P) return 1;
else return -1;
}
double max(double a,double b)
{
return a>b?a:b;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
int i,j;
int size=0;
for(i=0;i<n;i++)
{
scanf("%d",&t[i]);
for(j=0;j<t[i];j++)
{
scanf("%lf%lf",&a[i][j].B,&a[i][j].P);
b[size++]=a[i][j].B;
}
qsort(a[i],t[i],sizeof(a[0][0]),cmp);
}
int si;
double ans=0;
double Psum=0;
for(si=0;si<size;si++)
{
for(i=0;i<n;i++)
{
for(j=0;j<t[i];j++)
{
if(a[i][j].B>=b[si])
{
Psum+=a[i][j].P;
break;
}
}
if(j==t[i])
{
Psum=0;
break;
}
}
if(Psum!=0)
{
ans=max(ans,b[si]/Psum);
}
Psum=0;
}
printf("%.3lf\n",ans);
}
return 0;
}