1018 Communication System

题目:每次最难的不是编程,而是理解题意!快哭了。

描述
我们收到了Pizoor Communications Inc.的特殊通信系统订单。该系统由多个设备组成。对于每个设备,我们可以从几个制造商中自由选择。来自两家制造商的相同设备的最大带宽和价格不同。
总带宽(B)是指通信系统中所选设备的带宽的最小值,总价格(P)是所有选定设备的价格之和。我们的目标是为每个设备选择一个制造商以最大化B / P.
输入
输入文件的第一行包含一个整数t(1≤t≤10),测试用例的数量,后跟每个测试用例的输入数据。每个测试用例以包含单个整数n(1≤n≤100)的行开始,通信系统中的设备数量,后面是以下格式的n行:第i行(1≤i≤n)从mi(1≤mi≤100)开始,第i个设备的制造商数量,然后是同一行中的mi对正整数,分别表示设备的带宽和价格,对应于制造商。
输出
您的程序应为每个包含单个数字的测试用例生成一行,该数字是测试用例的最大可能B / P.将输出中的数字四舍五入到小数点后的3位数。
样例输入  
1 3
3 100 25 150 35 80 25
2 120 80 155 40
2 100 100 120 110
样例输出
0.649

//232K    47MS    C++    1164B    2014-05-07 19:16:42
#include<stdio.h>
#include<string.h>
#include<stdlib.h> 
struct node{
    int b;
    int p;
}a[105][105];
int b[105];
int n;
inline int Max(int x,int y)
{
    return x>y?x:y;
}
inline int Min(int x,int y)
{
    return x<y?x:y;
}
int main(void)
{
    int t,m;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        int ln=0x7ffffff,rn=0;
        for(int i=0;i<n;i++){
            scanf("%d",&b[i]);
            for(int j=0;j<b[i];j++){
                scanf("%d%d",&a[i][j].b,&a[i][j].p);
                ln=Min(ln,a[i][j].b);
                rn=Max(rn,a[i][j].b);
            }
        }
        double ans=0;
        for(int i=ln;i<=rn;i++){
            int sminn=0;
            for(int j=0;j<n;j++){
                int minn=0x7ffffff;
                for(int k=0;k<b[j];k++){
                    if(a[j][k].b>=i && minn>a[j][k].p)
                        minn=a[j][k].p;
                }
                sminn+=minn;
            }
            ans=ans>(i*1.0/sminn)?ans:(i*1.0/sminn);
            //printf("*****%lf\n",ans);
        }   
        printf("%.3lf\n",ans);
    }
    return 0;
}

 

posted on 2019-09-14 01:54  姜姜糖  阅读(261)  评论(0编辑  收藏  举报