POJ 1018--Communication System

题意

题目的大概意思是,采购一套通信设备,这套通信设备由若干个设备组成,每个设备可能有若干个不同的厂家,每个厂家生产的设备价格和带宽均不等,最终这套通信设备的最大带宽由这若干个设备中带宽最小的那一个决定,总费用是每个设备的价格之和,求出最大性价比的选择。即每个设备选择哪一个厂家生产的可以使得min(bandwidth)/sum(price)最大。

分析

由于最终带宽由其中某设备决定,那么直接穷举所有的可能带宽即可。假定有编号为1~n的n个设备,S = {minband(1),minband(2) … minband(n)},为每个设备不同厂家中选出的最小带宽集合,T = {maxband(1),maxband(2) …maxband(n)},那么最终这套设备的带宽必定在min(S)到min(T)之间。

这样一来便很简单了。
代码如下:
Memory: 340K Time: 63MS Length:48LINES

#include<iostream>
#include<set>
using namespace std;
struct B_P { int bandwidth, price; };
#define max(a,b) (((a) > (b)) ? (a) : (b))
#define min(a,b) (((a) < (b)) ? (a) : (b))
int main()
{
    int cases = 0;
    int devices = 0;
    int manufacturers[100] = { 0 };
    B_P band_price[100][100];
    cin >> cases;
    while (cases-- > 0)
    {
        cin >> devices;
        set<int> Set_Band;
        int maxband = 0x7FFFFFFF;              //int的最大值
        for (int i = 0; i < devices; ++i)
        {
            cin >> manufacturers[i];
            int tmpband = 0;
            for (int j = 0; j < manufacturers[i]; ++j)
            {
                cin >> band_price[i][j].bandwidth >> band_price[i][j].price;
                Set_Band.insert(band_price[i][j].bandwidth);
                tmpband = max(tmpband, band_price[i][j].bandwidth);        //找到每个设备的带宽的最大值
            }
            maxband = min(maxband, tmpband);           //再在这若干个最大值里取最小的
        }
        double ratio = 0.0;
        for (set<int>::iterator it = Set_Band.begin(); it != Set_Band.end() && *it <= maxband; ++it)
        {
            int sumprice = 0;
            for (int i = 0; i < devices; ++i)
            {
                int minprice = 0x7FFFFFFF;
                for (int j = 0; j < manufacturers[i]; ++j)
                    if (band_price[i][j].bandwidth >= *it)   //找出每个设备的最小价格
                        minprice = min(minprice, band_price[i][j].price);
                sumprice += minprice;
            }
            ratio = max(ratio, *it / double(sumprice));
        }
        printf("%.3f\n", ratio);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值