http://poj.org/problem?id=1018
Description
Input
Output
Sample Input
1 3 3 100 25 150 35 80 25 2 120 80 155 40 2 100 100 120 110
Sample Output
0.649
/**
poj 1018 枚举
题目大意:某公司要建立一套通信系统,该通信系统需要n种设备,而每种设备分别可以有m1、m2、m3、...、mn个厂家提供生产,而每个厂家生产的同种设备都会存在两个方面的差别:带宽bandwidths 和 价格prices。
现在每种设备都各需要1个,考虑到性价比问题,要求所挑选出来的n件设备,要使得B/P最大。其中B为这n件设备的带宽的最小值,P为这n件设备的总价。
解题思路:这道题的a[i][j]较小,可以用枚举直接过,枚举所有可能的B值。(所有组别中最小的最小值和最小的最大值之间,至于flag判断没有也可以,只是这样可以优化一下时间复杂度)
*/
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
struct note
{
int x,y;
} a[105][105];
int n,num[105],maxx[105],minn[105],flag[100005];
int find(int b)
{
int ret=0;
for(int i=0; i<n; i++)
{
int minp=0x3f3f3f3f;
for(int j=0; j<num[i]; j++)
{
if(a[i][j].x>=b)
minp=min(minp,a[i][j].y);
}
ret+=minp;
}
return ret;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
memset(flag,0,sizeof(flag));
for(int i=0; i<n; i++)
{
scanf("%d",&num[i]);
for(int j=0; j<num[i]; j++)
{
scanf("%d%d",&a[i][j].x,&a[i][j].y);
flag[a[i][j].x]=1;
}
}
for(int i=0; i<n; i++)
{
minn[i]=maxx[i]=a[i][0].x;
for(int j=1; j<num[i]; j++)
{
maxx[i]=max(maxx[i],a[i][j].x);
minn[i]=min(minn[i],a[i][j].x);
}
}
int s=minn[0];
int e=maxx[0];
for(int i=1; i<n; i++)
{
s=min(s,minn[i]);
e=min(e,maxx[i]);
}
double ans=0;
for(int i=s; i<=e; i++)
{
if(flag[i])
{
int d=find(i);
ans=max(ans,i*1.0/d);
}
}
printf("%.3lf\n",ans);
}
return 0;
}
原文:http://blog.csdn.net/lvshubao1314/article/details/42918245