pku 1018 DP Communication System解题报告
2009-02-21 14:27
253 查看
一、题目:Communication System
二、题意:买n种产品,每种产品也有m[j]种选择.每种产品各有加宽bandwide与价格price,顾客选择n种产品,其中最大带宽B是所有装置最大带宽的最小值,价格P是所有装置价格之和,求B/P的最大值。
三、解决办法:
如果采用爆搜的话,时间肯定是不允许的。而从题意可知,如果加宽大而且价格便宜,那么这就更加有可能被选择到的;但如果我们开始爆搜价格之和的话,那将十分困难。我们可以先爆搜加宽bandwide,然后我们再用i从bandwide的low到high枚举,在每种产品选择中搜索加宽bandwide>=i与price较小者.再用贪心选择与更新的result(B/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
二、题意:买n种产品,每种产品也有m[j]种选择.每种产品各有加宽bandwide与价格price,顾客选择n种产品,其中最大带宽B是所有装置最大带宽的最小值,价格P是所有装置价格之和,求B/P的最大值。
三、解决办法:
如果采用爆搜的话,时间肯定是不允许的。而从题意可知,如果加宽大而且价格便宜,那么这就更加有可能被选择到的;但如果我们开始爆搜价格之和的话,那将十分困难。我们可以先爆搜加宽bandwide,然后我们再用i从bandwide的low到high枚举,在每种产品选择中搜索加宽bandwide>=i与price较小者.再用贪心选择与更新的result(B/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
相关文章推荐
- Pku acm 2075 Tangled in Cables数据结构题目解题报告(十一)最小生成树:prim算法&amp;amp;二叉查找树
- PKU 2366 Wireless Network (解题报告)
- PKU POJ 1611解题报告(并查集)
- pku 3342 Party at Hali Bula 树形dp 解题报告
- pku 1166 the clocks 高斯消去法 解题报告
- pku 1905 二分 Expanding Rods 解题报告
- pku 1129 channel allocation 回溯解题报告
- pku 1179 polygon 石子合并的变形题dp 解题报告
- pku 1018 ( 贪心 )
- pku 2253 Frogger Prim算法巧用 解题报告
- pku 2623 sequence median 水题 解题报告
- pku 1961 KMP period 解题报告
- 解题报告BLOG开启。。第一题 PKU1922 Ride to School
- pku acm 2362 square 解题报告
- Pku acm 1080 Humman Gene Function 动态规划题目解题报告(八)
- Pku acm 1088 滑雪 动态规划题目解题报告(十五)
- Pku acm 1125 Stockbroker Grapevine 动态规划题目解题报告(十九)
- Pku acm 1423 Big Number 解题报告----求n!的位数
- Pku acm 1274 The Perfect Stall 数据结构题目解题报告(十三)---- 匈牙利算法求二分图的最大匹配
- Pku acm 1961 Period数据结构题目解题报告(十九)----kmp算法