POJ-1018
网上有人说这道题的每个mi均不超过1009,因此就比较简单了,dp也好暴力也好贪心也好。不过我写这个dp时候总觉得要T了=_=
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <climits>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <bitset>
#include <deque>
#include <vector>
#include <queue>
#include <utility>
#include <stack>
#include <functional>
using namespace std;
typedef long long lovelive;
const int inf = INT_MAX;
const double pai = acos(-1.0);
const double gold = (sqrt(5.0) - 1.0) / 2.0;
double base_arr[117][117][2], dp[117][1117];
int listc[117];
int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
// freopen("in.in", "r", stdin);
// freopen("out.out", "w", stdout);
#endif // ONLINE_JUDGE
int i, j, k;
int t, n, mi;
while(scanf("%d", &t) != EOF)
{
while(t--)
{
memset(listc, 0, sizeof(listc));
memset(base_arr, 0, sizeof(base_arr));
scanf("%d", &n);
for(i = 1; i <= n; ++i)
{
for(j = 1; j <= 1110; ++j)
{
dp[i][j] = inf;
}
}
for(i = 1; i <= n; ++i)
{
scanf("%d", &mi);
listc[i] = mi;
for(j = 1; j <= mi; ++j)
{
scanf("%lf %lf", &base_arr[i][j][0], &base_arr[i][j][1]);
if(i == 1)
{
for(k = 1; k <= base_arr[i][j][0]; ++k)
{
dp[1][k] = min(base_arr[i][j][1], dp[1][k]);
}
}
}
}
for(i = 2; i <= n; ++i)
{
for(j = 1; j <= listc[i]; ++j)
{
for(k = 1; k <= base_arr[i][j][0];++k)
{
dp[i][k] = min(dp[i - 1][k] + base_arr[i][j][1], dp[i][k]);
}
}
}
double maxc = 0.0;
for(i = 1; i <= n; ++i)
{
for(j = 1; j <= listc[i]; ++j)
{
if(base_arr[i][j][0] / dp[n][(int)(base_arr[i][j][0])] >= maxc)
{
maxc = base_arr[i][j][0] / dp[n][(int)(base_arr[i][j][0])];
}
}
}
printf("%.3lf\n", maxc);
}
}
return 0;
}