地精的贸易.pptVIP

  • 3
  • 1
  • 约1.63千字
  • 约 8页
  • 2018-03-02 发布于河南
  • 举报
地精的贸易

* 地精的贸易 From:徐钧鸿 WhiteξLight 问题回顾 聪明地地精发现,联盟与部落的市场上的某些商品存在着很大的差价。这决定了地精可以从中获取相当可观的利润。然而这个发现还并没有被大部分地精知道,于是年轻的地精菲利克斯决定从事此业。菲利克斯几乎花光了他所有的积蓄购买了一个相当大的飞艇,以及往返于暴风城和银月城之间的各种通行证。暴风城和银月城分别是联盟和部落的商业中心。菲利克斯决定在暴风城购买一些商品,驾驶飞艇到银月城以当地市场价卖掉,然后在银月城买一些商品,驾驶飞艇再回到暴风城卖掉。这样一个来回,菲利克斯可以赚到不少钱。 通过商业调查,他已经在出发前就知道了联盟和部落的各种商品的价格。在他现有的资产的前提下,他希望能够在一次旅行中赚取尽可能多的金币。那么请你设计一个程序,为菲利克斯设计一个购买方案,使一次来回能够赚到最多的金币。 输入格式 第1行,两个整数,N,M,表示他在出发前有N个金币,联盟和部落的市场中都有M种商品。 第2-M+1行,每行两个整数,Ai,Bi,表示第i种商品在暴风城的市场价为Ai,在银月城的市场价为Bi。 输出格式 第1行,一个整数,菲利克斯一次来回最多能够赚到的金币数。最后结果不超过4000000。 第2 - M+1行,第i+1行为第i个商品的购买方法,输出一个句子。如果要从联盟购买k个,输出”Buy k from Alliance”,如果要从部落购买k个,输出”Buy k from Horde”,如果不需要购买,输出”Buy 0”。如果多个的方案赚得的金币都是最大,则输出购买的商品序号最靠前的这种方案。 样例输入 23 5 6 9 11 7 3 2 4 6 5 3 样例输出 33 Buy 3 from Alliance Buy 1 from Horde Buy 0 Buy 1 from Alliance Buy 9 from Horde 样例说明 初始时,菲利克斯在暴风城,他有23个金币,这时他购买3个商品1,1个商品4,花费3*6+1*4=22个金币,剩余1个金币。到达银月城,他把它们卖掉,可以获得3*9+1*6=33个金币,赚了11个金币。这时,他用他的34个金币,在银月城购买1个商品2,9个商品5,花费1*7+9*3=34个金币。回到暴风城,卖掉可以获得1*11+9*5=56个金币,赚了22个金币。与起始时他的23个金币相比,他赚了33个金币。 数据规模 1=N=100,000 试题分析 一到明显的背包题目,就是算两边背包。可以简单的分析一下:先算完一遍背包,可以得到去银月城卖出后手中的最大钱数,再做一遍动规,算出回到暴风城后的钱数。任意一段不用动规,则算不出钱数的最大值,必然没有钱数大的选择性广,就保证不了最优,所以两遍动规是可以的,也是必需的。 用钱数n做背包容量,m件物品(其实可以更小,因为要赚钱的,差价应是正数)。去的时候,每个背包的价值是b[i]-a[i];回来时a[i]-b[i];保证都是正数。由于是无限拿取,用完全背包。每走一个容量,都记录装了哪些物件。 状态转移方程 F[i]=Max{ F[ i-A[j] ] | j=1..M} 做完之后发现错了3个点:1,8,9。1和9都是因为输出的选择方案与答案不同。再一看题:如果多个的方案赚得的金币都是最大,则输出购买的商品序号最靠前的这种方案。 而在完全背包中,习惯于每走到下一个容量,都要把上一层的值赋给这一层。而在本题中,不一定要花光每一块钱去买物品,即背包无法装满,所以要在走最后一个容量时省掉复赋值语句,这样就可以让序号小的先装入背包,防止序号小的喧宾夺主。而第8个点是错在数组的范围上。这道题开始的钱数不过100,000,但是到了银月城卖出后就不少钱了,第8个点就将近400,000,所以数组要开大。 *

文档评论(0)

1亿VIP精品文档

相关文档