【问题标题】:SPOJ ANARC07G Let go to the movies approachSPOJ ANARC07G 放手去看电影的方法
【发布时间】:2013-12-27 07:14:50
【问题描述】:

this 问题中,我们必须找到所需的单人票和家庭票数量,以使价格最低。如果许多安排的价格相同,则以最少门票打印安排。

问题陈述 Acmestan 的电影院有两种类型的门票:单人票仅适用于一个人,而家庭票则允许父母和他们的孩子进入电影院。不用说,家庭票的价格总是高于单程票,有时甚至高达单程票的五倍。

对于家庭来说,决定购买哪种机票安排最经济是相当具有挑战性的。例如,右图中描绘的家庭有四种门票安排可供选择: 七张单人票;两张家庭票;一张家庭票(亚当、鲍勃、辛迪),其余四张单人票;或者,一张家庭票(鲍​​勃和他的四个孩子)加上剩下两个的单人票。

编写一个程序来确定哪种票安排的价格最低。如果有多个这样的安排,请打印票数最少的安排。

我的DP方法如下:-

  1. 制作家谱。

  2. 每个节点都应该有字段 min_tickets(即最低门票数量)和 min_price(即最低价格)。这些字段表示将该人和他的孩子带出去所需的最低金额。此外,还有一些字段表示过程中涉及的家庭票数(fam_tickets)和单票数(sin_tickets)。

  3. 从叶节点开始。初始化min_tickets=1min_price= S(即单票价格)、fam_tickets=0sin_tickets= 1

  4. 现在对于其他节点考虑他的子孙。 F 是家庭票的价格。对他们来说:-

    min_price= min(F + min_price 所有孙子的总和 , S + 所有孩子的 min_price 的总和)

    如果孙子为 NULL,我们采用 min_price=0 and min_tickets=0

  5. 为了找出 min_tickets,我们从给出最低价格的形式中推导出它。如果两种形态都降到相同的价格,我们会这样做:-

 if(1+ min_tickets of all grandchildren summed > 1+ min_tickets of all children summed)  
      min_tickets = 1+ min_tickets of all children summed;
      fam_tickets= fam_tickets of all children summed;
      sin_tickets= 1+ sin_tickets of all children summed;
 else  
      min_tickets = 1+ min_tickets of all grandchildren summed;
      fam_tickets= 1+ fam_tickets of all grandchildren summed;
      sin_tickets= sin_tickets of all grandchildren summed;

这个解决方案正确吗?提前致谢。

【问题讨论】:

  • 看起来很复杂(这是一个不好的迹象),这个问题看起来非常类似于最小顶点覆盖问题。但我认为DP是一个正确的选择。
  • 我认为您的解决方案是正确的。您是否面临任何具体问题?
  • @AbhishekBansal...没有..只是想检查一下
  • @avinash 我认为 SPOJ 在线评委比我们更有资格检查您的方法。
  • @AbhishekBansal....问题下方的 cmets 提到了输入格式/文件中的一些问题...所以我想检查问题是否出在我的方法中

标签: algorithm dynamic-programming


【解决方案1】:

您是否考虑过他们在您的示例中购买两张家庭票以获得最大利润的情况? 看来在您的解决方案中,在处理亚当的节点时,

min_price= min(F + min_price of all grandchildren summed , S + min_price of all children summed)

不会工作。

我不知道你的实现细节,但这是一个棘手的部分。希望能帮助到你。 :)

【讨论】:

  • @songlj...谢谢...我错过了...但我认为我需要做的就是添加'F + min_price of all children summed'...正确吗?
  • @avinash 是的,我认为它应该类似于“F+min(所有孩子的 min_price 总和,所有孙辈的 min_price 总和)。请试一试。:)
  • 你可以做min_price = min(F + min_price of all grandchildren summed , S + min_price of all children summed, F + min_price of all children summed)
猜你喜欢
  • 2016-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多