您的位置:首页 > 其它

pku 1018 DP Communication System解题报告

2009-02-21 14:27 253 查看
一、题目:Communication System
二、题意:买n种产品,每种产品也有m[j]种选择.每种产品各有加宽bandwide与价格price,顾客选择n种产品,其中最大带宽B是所有装置最大带宽的最小值,价格P是所有装置价格之和,求B/P的最大值。
三、解决办法:
如果采用爆搜的话,时间肯定是不允许的。而从题意可知,如果加宽大而且价格便宜,那么这就更加有可能被选择到的;但如果我们开始爆搜价格之和的话,那将十分困难。我们可以先爆搜加宽bandwide,然后我们再用ibandwidelowhigh枚举,在每种产品选择中搜索加宽bandwide>=iprice较小者.再用贪心选择与更新的resultB/P的最大值)。
四、源代码:

#include "stdio.h"

int main()
{
freopen("1.txt", "r", stdin);

int t, n, m[100], b[100][100], p[100][100]; //输入的值
int i, j, k; //辅助变量
int high, low, temp, sum;
double result;

scanf("%d", &t);
while (t--)
{
scanf("%d", &n);

//设置初值,以便赋值.
high = 0;
low = 32767;

//获得一个最小和最大带宽:最小带宽low是各个设备最大带宽的最小值,
//最大带宽high是各个设备最大带宽的最大值.
//枚举band的最小值与最大值.
for (i = 0; i < n; i++)
{
scanf("%d", &m[i]);
for (j = 0; j < m[i]; j++)
{
scanf("%d%d", &b[i][j], &p[i][j]);
if (b[i][j] > high)
{
high = b[i][j];
}
if (b[i][j] < low)
{
low = b[i][j];
}
}
}

//从最小值递增到最大值进行寻找,计算各种设备价钱的最小值的和,
//然后计算出一个比值,如果比值比当前比值大,更换当前比值;
result = 0.0;
for (i = low; i <= high; i++)
{
sum = 0;
//贪心的选择n种品牌.
for (j = 0; j < n; j++)
{
temp = 32767;
for (k = 0; k < m[j]; k++)
{
//这里的band与price分别要最大与最小的
//这样Bmin/Psum就最大啦!
if (b[j][k] >= i && p[j][k] < temp)
{
temp = p[j][k];
}
}
sum += temp;
}

if ((double) i / (double) sum > result)
{
result = (double) i / (double) sum;
}
}

printf("%.3lf/n", result);

}

return 0;
}
五、time:47ms,memory:260k
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: