牢记牢记
double型的输入输出形式如下:
scanf("%lf",&a);
printf("%f",a);
用%lf输出不对!不对!不对!!
要求有两个变量的函数的最值,需要固定住一个去求另一个!
本题用dfs穷举会超时(如果剪枝剪的好可能也不会超?==)
#include<stdio.h>
#include<string.h>
#define MAX 110
int bi[MAX][MAX],pi[MAX][MAX];
int mi[MAX],flag;
double bp;
int findp(int curi, int b){
int i,j,tmp = 0xffff;
for(i=0; i<mi[curi];i++){
if(bi[curi][i] >= b && pi[curi][i] <tmp){
if(bi[curi][i]==b) flag = 1;
tmp = pi[curi][i];
}
}
return tmp;
}
int main(){
int t,n,i,j,k,bmin,bmax,b,p;
double bp;
scanf("%d",&t);
while(t--){
bp =0;
bmin = 0xffff;
bmax = 0;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&mi[i]);
for(j=0;j<mi[i];j++){
scanf("%d%d",&bi[i][j],&pi[i][j]);
bmin = (bi[i][j]<bmin)? bi[i][j]: bmin;
bmax = (bi[i][j]>bmax)? bi[i][j]: bmax;
}
}
for(k = bmin; k <= bmax; k++){
p =0;
flag = 0;
for(i=0;i<n;i++){
p+= findp(i, k);
}
if(flag)
bp = (double)k/p > bp? (double)k/p: bp;
}
printf("%.3f\n",bp);
}
return 0;
}