PKU 1018-Communication System
1018 Communication System - PKU Wiki*
解法
最小値を仮定するとO(N^2)で最大のM/Pを求めることが出来るので,全ての最小値についてそれを実行する.
O(N^4)ぐらいになる.
実装(C++)
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int vals[10001]; int cnt; int t,n; int m[101]; int b[101][101],p[101][101]; int solve(int k,int Min){ if(k==n){ return 0; } int M=99999999; for(int i=0;i<m[k];i++){ if(b[k][i]>=vals[Min]){ M=min(M,p[k][i]); } } return solve(k+1,Min)+M; } int main() { scanf("%d",&t); while(t--){ scanf("%d",&n); cnt=0; for(int i=0;i<n;i++){ scanf("%d",&m[i]); for(int j=0;j<m[i];j++){ scanf("%d%d",&b[i][j],&p[i][j]); vals[cnt++]=b[i][j]; } } std::sort(vals,vals+cnt); cnt=std::unique(vals,vals+cnt)-vals; double res=0.0; for(int i=0;i<cnt;i++){ res=max(res,(double)vals[i]/solve(0,i)); } printf("%.3f\n",res); } return 0; }