Communication System
大致题意:
需要n台设备,每台设备有m家厂家提供,每家厂家提供的设备参数和价格不同,求f/p的最大值
f为这n件设备的参数的最小值,f为这n件设备的总价
解题思路:
状态方程:f[i][j]表示第i台设备参数最小是j的最低价格 ,初始化INF
状态转移:如果j<=a,(a指的是参数),f[i][j]=min(f[i][j],f[i-1][j]+b) (b指的是价格)
反之,f[i][a]=min(f[i][a],f[i-1][j]+b)
最后在i/f[n][i]中取最小值
AC代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdio>
#define rep(i, n) for (int i = 1; i <= (n); ++i)
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int N = 110;
int n, m;
int f[N][N * N];
int main(void)
{
int t; cin >> t;
while (t--) {
memset(f, INF, sizeof f);
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> m;
while (m--) {
int a, b; cin >> a >> b;
if (i == 1)f[i][a] = min(f[i][a], b);
else {
for (int j = 0; j < N * N; ++j) {
if (j <= a)f[i][j] = min(f[i][j], f[i - 1][j] + b);
else f[i][a] = min(f[i][a], f[i - 1][j] + b);
}
}
}
}
double res = 0;
for (int i = 0; i < N * N; ++i)
if (f[n][i] != INF)
res = max(res, 1.0 * i / f[n][i]);
printf("%.3f\n", res);
}
return 0;
}