这道DP真是没想出来怎么做,不过看了别人的代码后发现也只能这么想了,只有B的状态是可以确定的,然后枚举B,
还可以再优化一下,但是数据量不大,就没这个必要了……
#include <iostream> #include <cstdio> #include <vector> using namespace std; const int N = 105; vector<int> B[N], P[N]; //由于是不定长数组,所以用vector int BMin, BMax; void input( int& n ) { //输入数据,并且获取BMin, BMax的值. int m, b, p; scanf("%d", &n); for( int i = 0; i < n; ++i ) { B[i].clear(), P[i].clear(); scanf("%d", &m); int temp = -1; while(m--) { scanf("%d%d", &b, &p); BMin = min(BMin, b); temp = max(temp, b); B[i].push_back(b), P[i].push_back(p); } BMax = min(BMax, temp); } } void slove( ) { BMin = 100000000, BMax = 100000000; int n; input(n); double ans = 0; for( int i = BMin; i <= BMax; ++i ) { double PSum = 0; for( int j = 0; j < n; ++j ) { int Size = B[j].size(), temp = 100000000; for( int k = 0; k < Size; ++k ) { if( B[j][k] >= i && P[j][k] < temp ) temp = P[j][k]; } PSum += temp; } ans = max( ans, i / PSum ); } printf("%.3lf ", ans); } int main() { int t; scanf("%d", &t); while(t--) slove(); return 0; }