题目链接:http://poj.org/problem?id=1018
题目描述:
就是给定n组数,每一组中包含mi对数,(b,p),要求从每一组中取出一对数,求取出的n对数中bmin / sum(p)的最大值。
这题的数据比较弱,b的取值范围不是很大,因此我是直接从b的最小值开始到b的最大值进行枚举,然后贪心取最小的p即可。
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std ;
const double MAXM = 1.0*1e8 ;
struct info{
double b ;
double p ;
};
int n, num[105], sum ;
double bb[105*105] ;
info val[105][105] ;
///
void cal(){
double res = 0.0, BB ;
for( int i = bb[0]; i <= bb[sum-1]; i++ ){
BB = i ;
double m = 0.0 ;
for( int j = 0; j < n; j++ ){
double tmp = MAXM ;
for( int k = 0; k < num[j]; k++ ){
if( val[j][k].b >= BB && val[j][k].p < tmp ){
tmp = val[j][k].p ;
}
}
m += tmp ;
}
double vv = 1.0*BB / m ;
if( res < vv ){
res = vv ;
}
}
printf("%.3f\n",res) ;
}
//
int main(){
//freopen("1234.in","r",stdin) ;
int t ;
while( scanf("%d",&t) != EOF ){
while( t-- ){
scanf("%d",&n) ;
sum = 0 ;
for( int i = 0; i < n; i++ ){
scanf("%d",&num[i]) ;
for( int j = 0; j < num[i]; j++ ){
cin >> val[i][j].b >> val[i][j].p ;
bb[sum++] = val[i][j].b ;
}
}
sort(bb,bb+n) ;
cal() ;
}
}
return 0 ;
}