这是一道简单的dp题。
首先想想,b/p最大,就是想让b最大,p最小。
状态定义f[i][j]=前i行最小最小值为j的最小价值p,这样用b/p才最大,最后一个个枚举。(自然保证最大) |
对了,还有的就是用c++ 提交
Code:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int t,n;
struct node
{
int b[110],p[110];
int k;
}Syt[110];
int Maxx;
void Input()
{
Maxx=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&Syt[i].k);
for(int j=1;j<=Syt[i].k;j++)
{
scanf("%d%d",&Syt[i].b[j],&Syt[i].p[j]);
Maxx=max(Maxx,Syt[i].b[j]);
}
}
}
int f[110][11000];
double sum;
void Solve()
{
memset(f,63,sizeof(f));
for(int i=1;i<=Maxx;i++)
f[0][i]=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=Syt[i].k;j++)
for(int k=1;k<=Syt[i].b[j];k++)
f[i][k]=min(f[i][k],f[i-1][k]+Syt[i].p[j]);
sum=0;
for(int i=1;i<=Maxx;i++)
sum=max(sum,1.0*i/f[n][i]);
}
void Output()
{
printf("%.3lf\n",sum);
}
int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
int t;
scanf("%d",&t);
while(t--)
{
Input();
Solve();
Output();
}
return 0;
}