题意
题目的大概意思是,采购一套通信设备,这套通信设备由若干个设备组成,每个设备可能有若干个不同的厂家,每个厂家生产的设备价格和带宽均不等,最终这套通信设备的最大带宽由这若干个设备中带宽最小的那一个决定,总费用是每个设备的价格之和,求出最大性价比的选择。即每个设备选择哪一个厂家生产的可以使得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;
}