可能有很多方法吧,用的DP做的,其他的现在暂时不知道怎么用,枚举的是带宽,如果选择了价格来枚举的话,用的内存可能会更大而且一般是会TLE的
代码在这:
#include <iostream> #include <cstdio> using namespace std; int dp[110][1100]; int b[110][110]; int p[110][110]; int t,n; int m[110]; int main() { scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=1;i<=n;++i) { scanf("%d",&m[i]); for(int j=1;j<=m[i];++j){ scanf("%d%d",&b[i][j],&p[i][j]); } for(int j=0;j<1100;++j) dp[i][j]=1e8; } for(int i=1;i<=n;++i) { for(int j=1;j<=m[i];++j) { if(i==1) dp[1][b[1][j]]=min(dp[1][b[1][j]],p[1][j]); else { for(int k=0;k<1100;++k) { if(dp[i-1][k]!=1e8) { if(k<=b[i][j]) dp[i][k]=min(dp[i][k],dp[i-1][k]+p[i][j]); else dp[i][b[i][j]]=min(dp[i][b[i][j]],dp[i-1][k]+p[i][j]); } } } } } double res=0; for(int i=0;i<1100;++i) { if(dp[n][i]!=1e8) { double x=(double)i/dp[n][i]; if(x>res) res=x; } } printf("%.3f\n",res); } return 0; }