标签:
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