#include <iostream> using namespace std; int v[105][1001]; int Max = 1000; int main() { int N, n, m; int wide, price; scanf("%d", &N); while(N--) { scanf("%d", &n); memset(v, 0x7f, sizeof(v)); //dp for(int i = 1; i <= Max; ++i) v[0][i] = 0; for(int i = 1; i <= n; ++i) { scanf("%d", &m); for(int j = 0; j < m; ++j) { scanf("%d%d", &wide, &price); for(int k = 1; k <= wide; ++k) if(v[i-1][k] + price < v[i][k]) v[i][k] = v[i-1][k] + price; for(int k = wide+1; k <= Max; ++k) if(v[i-1][k] + price < v[i][wide]) v[i][wide] = v[i-1][k] + price; } } //cal sum double ret = 0.0; for(int i = 1; i <= Max; ++i) if((1.0*i/v[n][i]) > ret) ret = 1.0*i/v[n][i]; printf("%.3lf/n", ret); } return 0; } //dp问题和经典的解答方法: // v[i][j]为前i件物品,width为j时的最小price //i:1->n,不断更新width为j时的最小price