http://poj.org/problem?id=1018
枚举加优化,这题提交AC了,但是却发现自己的代码根本不正确,数据弱爆了,后来改了一下。。。 注意这题网上的大多数代码是错误的,虽然用它们的程序能过。。。
#include <cmath>
#include <ctime>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <deque>
#include <list>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
#include <functional>
using namespace std;
//----------------------------------------------------------
#define CL(a,b) memset(a,b,sizeof(a))
#define CLQ(q) while(!q.empty())q.pop();
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define FD(i,a,b) for(int i=a;i>=b;--i)
#define FS(i,a) for(int i=0;a[i];++i)
#define REP(i,n) for(int i=0;i<n;++i)
#define PR2(a,n,m) for(int i=0;i<n;++i){for(int j=0;j<m;++j)cout<<a[i][j]<<" ";puts("");}
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define checkMax(a,b) {if(a<b)a=b;}
#define checkMin(a,b) {if(a>b)a=b;}
#define READ(a) freopen(a,"r",stdin)
#define WRITE(a) freopen(a,"w",stdout)
#define sqr(x) ((x)*(x))
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3fLL
#define eps 1e-10
typedef long long LL;
const double pi = acos(-1.0);
const double hpi = asin(1.0);
//-----------------------------------------------------------
const int MAXN = 10010;
struct Node
{
int id, b, p;
Node() {}
Node(int t_id, int t_b, int t_p) : id(t_id), b(t_b), p(t_p) {}
friend bool operator < (const Node &p1, const Node &p2)
{
if(p1.b == p2.b)
return p1.p < p2.p;
return p1.b < p2.b;
}
}arr[MAXN];
int max_item[110], min_item[110], used[110];
int T, tot, n, m, min_max;
double ans;
void solve()
{
ans = -inf;
min_max = inf;
int cnt, sum;
FOR(i, 1, n) min_max = min(min_max, max_item[i]);
FOR(i, 1, tot-n+1)
{
if(arr[i].b > min_max) break;
cnt = 1; sum = 0; CL(used, 0); used[arr[i].id] = 1;
CL(min_item, inf); min_item[arr[i].id] = arr[i].p;
FOR(j, i+1, tot)
{
if(arr[j].id == arr[i].id) continue;
min_item[arr[j].id] = min(min_item[arr[j].id], arr[j].p);
if(!used[arr[j].id])
{
used[arr[j].id] = 1;
cnt++;
}
}
if(cnt < n)
break;
else
{
FOR(j, 1, n) sum += min_item[j];
ans = max(ans, arr[i].b*1.0 / sum);
}
}
}
int main()
{
//READ("aa.in"); WRITE("bb.out");
int x, y;
cin >> T;
while(T--)
{
tot = 0; CL(max_item, -1);
cin >> n;
FOR(i, 1, n)
{
cin >> m;
FOR(j, 1, m)
{
cin >> x >> y;
max_item[i] = max(max_item[i], x);
arr[++tot].id = i;
arr[tot].b = x;
arr[tot].p = y;
}
}
sort(arr, arr + tot + 1);
solve();
printf("%.3lf\n", ans);
}
return 0;
}