ZOJ1409这个题目的大意我看了很久才明白,呵呵,英语还是差了点,以下是源代码和题目的描述
描述:
某通信公司需要购置一个通信系统,这个系统由几个设备组成,每个设备都有几个不同的厂商,他们提供的设备的带宽和价格有所不同。 系统的总带宽B是几个设备中带宽的最小值,而系统的价格P则是几个设备的价格最和。 给出每个设备的所有厂商的设备带宽和价格,请你选择一种方案,使得系统的B/P尽可能大(即同样的价格买到的带宽尽可能大)
输入:
第一行包含一个整数t(1<=t<=10),表示输入数据的组数,接下来是t组测试数据。 每组测试数据第一行是一个整数n(1<=n<=100),表示通信系统由n个不同的设备组成。 接下来n行,每行是一种设备的厂商信息。第一个整数是mi,表示第i个设备的厂商数目,接下来mi个数对,每个数对表示一个厂商提供的设备的带宽和价格。
关于输出
对每组测试数据,输出最大的B/P值,保留到小数点后3位。
#include<iostream>
#include<string>
#include<vector>
#include <algorithm>
using namespace std;
typedef struct
{
int band;
int price;
}Device;
vector< vector<Device> > devices; //相当于结构体向量的数组
bool Cmp(const Device &dev1,const Device &dev2)
{
return dev1.price<dev2.price;
}
double BPMAX_fuc(int row,int col)
{
int ii,jj;
int minband = devices[row][col].band; //认为传入的贷款是最小的带宽
double sumprice = devices[row][col].price;
int n = devices.size();
for(ii=0;ii<n;ii++)
{
if(ii==row) //本行不再进行计算
continue;
int m = devices[ii].size();
for(jj=0;jj<m;jj++)
{
if(devices[ii][jj].band>=minband)
{
sumprice+= devices[ii][jj].price;
break;
}
if( jj==m-1 ) //本行若是没有比认为最小的带宽 大的带宽 就返回零
return 0;
}
}
return minband/sumprice;
}
double process(void)
{
double max = 0;
int ii,jj;
int n=devices.size(); //表示系统由多少个设备组成
for(ii=0;ii<n;ii++)
{
int m = devices[ii].size();
for(jj=0;jj<m;++jj)
{
double bp = BPMAX_fuc(ii,jj); //认为这组数据的带宽是最小的
if(bp>max)
max = bp;
}
}
return max;
}
int main()
{
int cases=0; //表示多少个测试项目
cin>>cases;
for(int mm=0;mm<cases;mm++)
{
devices.clear();
int dev; //表示系统由多少个设备组成
cin>>dev;
for(int kk=0;kk<dev;kk++ )
{
int n; //同种设备有几个供应商
cin>>n;
vector <Device> v;
for(int ii=0;ii<n;ii++)
{
Device d;
cin>>d.band;
cin>>d.price;
v.push_back(d);
}
sort(v.begin(),v.end(),Cmp);
devices.push_back(v);
}
double Maxbp=process();
cout.precision(3);
cout<<fixed<<Maxbp<<endl;
}
return 0;
}