{
  "question_id": 7424992,
  "question_title": "蓝桥杯Candy Store",
  "question_content": "<p>问题描述\n经营一家糖果店是非常困难的&#xff0c;你需要优化各种各样的东西。最近你在销售一种非常时髦的糖果&#xff0c;叫做Whizboppers。这种糖果变质非常迅速&#xff0c;所以&#xff1a;<br />\n　　·你必须每天早上从供应商买来新的Whizboppers。<br />\n　　·你必须用当天早上从供应商买来的盒子装着糖果出售。<br />\n　　你可以从你的供应商处买来装有任意整数克糖果的盒子。<br />\n　　每天有至多k位顾客到你的店里来。从第1个人开始&#xff0c;每个人会选择花费整数分的钱来买Whizboppers&#xff0c;钱数在1分到C分之间&#xff08;包含1分和C分&#xff09;。你打算以1分钱每克的价格出售&#xff1b;所以如果一个人想要花4分钱&#xff0c;你会给他恰好4克糖果。你可以给他1个4克的盒子&#xff0c;也可能是1个2克的盒子和2个1克的盒子。<br />\n　　你最少需要买几个盒子才能保证&#xff0c;不管每个人想花多少钱买糖&#xff0c;你总是可以给他们对应质量的糖果&#xff1f;\n<br />　　注意&#xff1a;当一个人选择自己想买多少糖果后&#xff0c;你知道之前的人已经买了多少糖&#xff0c;但不能预知之后的人打算买多少糖。<br />\n　　举个例子&#xff0c;如果每天至多有2位顾客到你的店里&#xff0c;每个人至多花2分钱(k&#61;2,C&#61;2)&#xff0c;你可以从你的供应商买4个1克的盒子。但是你可以做的更好&#xff1a;只要买2个1克的盒子和1个2克的盒子&#xff0c;就可以满足你的顾客。如下所示&#xff1a;<br />\n第一个人给第一个人的盒子第二个人给第二个人的盒子2分1 个 2克2分<br />\n1分2 个 1克<br />\n1 个 1克1分1 个 1克2分<br />\n1分1 个 2克<br />\n1 个 1克<br />　　不论第一个人怎么买&#xff0c;你都可以给他对应质量的盒子&#xff0c;同时保证第二个人也能拿到正确质量的糖果。所以对于k&#61;2,C&#61;2&#xff0c;你用3个盒子就可以满足任意的顾客需求。\n输入格式\n　　第一行一个整数T&#xff0c;表示询问数量。\n　　接下来T行&#xff0c;每行包含两个整数k和C&#xff0c;分别表示最大人数和每个人花费的最多钱数。\n输出格式\n　　对于每一个询问&#xff0c;输出一行包含&#34;Case #x: y&#34;&#xff0c;x是询问编号&#xff08;从1开始标号&#xff09;&#xff0c;y是你每天最少需要的盒子数量。</p>",
  "difficulty": "困难",
  "answer_id": 53386266,
  "answer_content": "<p>帮你梳理一下思路&#xff0c;这个问题有两个关键点&#xff1a;</p>\n\n<p>1、需要的盒子的容量必须大于等于顾客的最大购买量。</p>\n\n<p>2、不论哪种情况&#xff0c;永远从2个1克的盒子开始计算。</p>\n\n<p><strong>例如&#xff0c;样例2 2&#xff0c;</strong>即每天至多有2位顾客到你的店里&#xff0c;每个人至多花2分钱&#xff0c;此时&#xff1a;</p>\n\n<p>1&#xff09;最大购买数量为&#xff1a;2*2&#61;4g</p>\n\n<p>2&#xff09;先给定两个1克的盒子&#xff1a;1g*2&#xff0c;容量&#xff1a;2g</p>\n\n<p>如果每人购买2g&#xff0c;则总共需要可装4g的盒子&#xff0c;此时的问题是&#xff1a;如何确定下一个盒子&#xff1f;</p>\n\n<p>当然&#xff0c;题目已经告诉我们了还需要1个2g的盒子&#xff0c;那么这个1个如何确定的呢&#xff1f;</p>\n\n<p>确定方法&#xff1a;(4-2)/2&#61;1。</p>\n\n<p>至此&#xff0c;容量为4g&#xff0c;满足最大购买数量&#xff0c;需要3个盒子&#xff0c;规格为&#xff1a;1g*2,2g*1。</p>\n\n<p>当然也有除不尽的情况&#xff0c;方法是向上取整。</p>\n\n<p><strong>例如&#xff0c;样例&#xff1a;1 5&#xff0c;</strong>即每天至多有1位顾客到店&#xff0c;至多花费5分钱&#xff0c;此时&#xff1a;</p>\n\n<p>1&#xff09;最大购买数量为&#xff1a;1*5&#61;5g</p>\n\n<p>2&#xff09;先给定两个1克的盒子&#xff1a;1g*2&#xff0c;容量&#xff1a;2g</p>\n\n<p>如果这个顾客购买3g&#xff0c;此时的问题是&#xff1a;如何确定下一个盒子&#xff1f;</p>\n\n<p>确定方法&#xff1a;(3-2)/3&#61;0.333&#xff0c;向上取整为1&#xff0c;所以还需要1个3g的盒子。</p>\n\n<p>至此&#xff0c;容量为5g&#xff0c;满足最大购买数量&#xff0c;需要3个盒子&#xff0c;规格为&#xff1a;1g*2,3g*1。</p>\n\n<p><strong>再比如&#xff0c;样例2 50&#xff0c;</strong>即每天至多有2位顾客到店&#xff0c;至多花费50分钱&#xff0c;此时&#xff1a;</p>\n\n<p>1&#xff09;最大购买数量为&#xff1a;2*50&#61;100g</p>\n\n<p>2&#xff09;先给定两个1克的盒子&#xff1a;1g*2&#xff0c;容量&#xff1a;2g</p>\n\n<p>如果每人购买2g&#xff0c;则还需要1个2g的盒子&#xff08;前面已给出&#xff09;&#xff0c;此时容量为4g</p>\n\n<p>如果每人购买3g&#xff0c;则总共需要可装6g的盒子&#xff0c;此时的问题依然是&#xff1a;如何确定下一个盒子&#xff1f;</p>\n\n<p>确定方法&#xff1a;(6-4)/3&#61;0.67&#xff0c;向上取整为1&#xff0c;所以还需要1个3g的盒子&#xff0c;此时容量为7g</p>\n\n<p>如果每人购买4g&#xff0c;则需要可装8g的盒子&#xff0c;此时的问题依然是&#xff1a;如何确定下一个盒子&#xff1f;</p>\n\n<p>确定方法&#xff1a;(8-7)/4&#61;0.25&#xff0c;向上取整为1&#xff0c;所以还需要1个4g的盒子&#xff0c;此时容量为11g</p>\n\n<p>如果每人购买6g&#xff0c;则需要可装12g的盒子&#xff0c;此时的问题依然是&#xff1a;如何确定下一个盒子&#xff1f;</p>\n\n<p>确定方法&#xff1a;(12-11)/6&#61;1/6&#xff0c;向上取整为1&#xff0c;所以还需要1个6g的盒子&#xff0c;此时容量为17g</p>\n\n<p>为什么是&#xff1a;如果每人购买6g&#xff1f;因为每次“如果”&#xff0c;都要使需要的容量超过了前一次的容量。</p>\n\n<p>......</p>\n\n<p>以此类推&#xff0c;直到容量大于等于100g&#xff0c;最终发现需要的盒子数量是11个&#xff0c;规格为&#xff1a;1g*2,2g*1,3g*1,4g*1,6g*1,......</p>\n\n<p>这就是这个问题的基本思路。</p>\n\n<p><strong>代码可以参考&#xff1a;</strong></p>\n\n<pre>\n<code class=\"language-cpp\">#include&lt;iostream&gt;\n#include&lt;cmath&gt;\nusing namespace std;\n\nint main()\n{\n\tint n, k, count &#61; 1;\n\tlong long c;\n\tcin &gt;&gt; n;\n\twhile (n--)\n\t{\n\t\tcin &gt;&gt; k &gt;&gt; c;\n\t\tint num &#61; k; \n\t\tlong long sum &#61; k;\n\t\tfor (long long i &#61; 2; i &lt;&#61; c; i &#61; sum / k &#43; 1)\n\t\t{\n\t\t\tint t &#61; num;\n\t\t\tnum &#43;&#61; ceil((k * i - sum) * 1.0 / i);\n\t\t\tsum &#43;&#61; i * (num - t);\n\t\t}\n\t\tcout &lt;&lt; &#34;Case #&#34; &lt;&lt; count&#43;&#43; &lt;&lt;&#34;: &#34; &lt;&lt; num &lt;&lt; endl;\n\t}\n\treturn 0;\n}</code></pre>\n\n<p> </p>",
  "tag_name": "c语言",
  "cpp": "#include<iostream>\n#include<cmath>\nusing namespace std;\nint main()\n{\n\tint n, k, count = 1;\n\tlong long c;\n\tcin >> n;\n\twhile (n--)\n\t{\n\t\tcin >> k >> c;\n\t\tint num = k; \n\t\tlong long sum = k;\n\t\tfor (long long i = 2; i <= c; i = sum / k + 1)\n\t\t{\n\t\t\tint t = num;\n\t\t\tnum += ceil((k * i - sum) * 1.0 / i);\n\t\t\tsum += i * (num - t);\n\t\t}\n\t\tcout << \"Case #\" << count++ <<\": \" << num << endl;\n\t}\n\treturn 0;\n}",
  "topic_link": "https://bbs.csdn.net/topics/600470178",
  "status": 1,
  "keywords": "算法中阶,贪心算法,活动选择问题,高级设计和分析技术",
  "license": "csdn.net",
  "notebook": {
    "cpp": "https://codechina.csdn.net/csdn/csdn-daily-code/-/jupyter/master/data/notebook/answer/ipynb/cpp/110.ipynb?type=file"
  },
  "notebook_enable": 1,
  "author": "qq_45688799"
}