POJ1018解题报告

http://poj.org/problem?id=1018

题目比较拗口,不过简单的理解就是。用户给定n行设备,这n行设备有m对,分别对应这个设备的带宽和价格。要求从这n行设备中每行选一个设备,使得B=min{bn1,bn2,...bnn},P=pn1+pn2+...+pnn,从而使得B/P得到最大。

我是看了别人的解题报告,用搜索+剪枝做的。

大概的思路如下:

首先,按从小到大的顺序,对所有的带宽进行排序。

如题:

1 3
3 100 25 150 35 80 25
2 120 80 155 40
2 100 100 120 110
那么得到的带宽排列为80、100、110、120和150.

然后从带宽为80开始,首先将minbrand设为80.再依次遍历每一行,初始时min=MAX_PRCICE,判断每一行中有没有设备brand>=minbrand且price<min。如果有,那么设found为true,并令min=price,否则,设found为false。

当found为false时,break,查找失败。进入下一轮循环。

当found为true时,sum+=min.

然后判断bp与minbrand/sum的大小关系。反复循环。

具体的代码如下,用G++编译器通过。(不过此代码有个缺陷,虽然能够AC,但不能保证brand等于minbrand的设备一定被选择了,之所以能够AC还是POJ的测试数据不够强的缘故。此缺陷有时间再完善。)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值