{
"question_id": 7424992, "question_title": "蓝桥杯Candy Store", "question_content": "<p>问题描述\n经营一家糖果店是非常困难的,你需要优化各种各样的东西。最近你在销售一种非常时髦的糖果,叫做Whizboppers。这种糖果变质非常迅速,所以:<br />\n ·你必须每天早上从供应商买来新的Whizboppers。<br />\n ·你必须用当天早上从供应商买来的盒子装着糖果出售。<br />\n 你可以从你的供应商处买来装有任意整数克糖果的盒子。<br />\n 每天有至多k位顾客到你的店里来。从第1个人开始,每个人会选择花费整数分的钱来买Whizboppers,钱数在1分到C分之间(包含1分和C分)。你打算以1分钱每克的价格出售;所以如果一个人想要花4分钱,你会给他恰好4克糖果。你可以给他1个4克的盒子,也可能是1个2克的盒子和2个1克的盒子。<br />\n 你最少需要买几个盒子才能保证,不管每个人想花多少钱买糖,你总是可以给他们对应质量的糖果?\n<br /> 注意:当一个人选择自己想买多少糖果后,你知道之前的人已经买了多少糖,但不能预知之后的人打算买多少糖。<br />\n 举个例子,如果每天至多有2位顾客到你的店里,每个人至多花2分钱(k=2,C=2),你可以从你的供应商买4个1克的盒子。但是你可以做的更好:只要买2个1克的盒子和1个2克的盒子,就可以满足你的顾客。如下所示:<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 /> 不论第一个人怎么买,你都可以给他对应质量的盒子,同时保证第二个人也能拿到正确质量的糖果。所以对于k=2,C=2,你用3个盒子就可以满足任意的顾客需求。\n输入格式\n 第一行一个整数T,表示询问数量。\n 接下来T行,每行包含两个整数k和C,分别表示最大人数和每个人花费的最多钱数。\n输出格式\n 对于每一个询问,输出一行包含"Case #x: y",x是询问编号(从1开始标号),y是你每天最少需要的盒子数量。</p>", "difficulty": "困难", "answer_id": 53386266, "answer_content": "<p>帮你梳理一下思路,这个问题有两个关键点:</p>\n\n<p>1、需要的盒子的容量必须大于等于顾客的最大购买量。</p>\n\n<p>2、不论哪种情况,永远从2个1克的盒子开始计算。</p>\n\n<p><strong>例如,样例2 2,</strong>即每天至多有2位顾客到你的店里,每个人至多花2分钱,此时:</p>\n\n<p>1)最大购买数量为:2*2=4g</p>\n\n<p>2)先给定两个1克的盒子:1g*2,容量:2g</p>\n\n<p>如果每人购买2g,则总共需要可装4g的盒子,此时的问题是:如何确定下一个盒子?</p>\n\n<p>当然,题目已经告诉我们了还需要1个2g的盒子,那么这个1个如何确定的呢?</p>\n\n<p>确定方法:(4-2)/2=1。</p>\n\n<p>至此,容量为4g,满足最大购买数量,需要3个盒子,规格为:1g*2,2g*1。</p>\n\n<p>当然也有除不尽的情况,方法是向上取整。</p>\n\n<p><strong>例如,样例:1 5,</strong>即每天至多有1位顾客到店,至多花费5分钱,此时:</p>\n\n<p>1)最大购买数量为:1*5=5g</p>\n\n<p>2)先给定两个1克的盒子:1g*2,容量:2g</p>\n\n<p>如果这个顾客购买3g,此时的问题是:如何确定下一个盒子?</p>\n\n<p>确定方法:(3-2)/3=0.333,向上取整为1,所以还需要1个3g的盒子。</p>\n\n<p>至此,容量为5g,满足最大购买数量,需要3个盒子,规格为:1g*2,3g*1。</p>\n\n<p><strong>再比如,样例2 50,</strong>即每天至多有2位顾客到店,至多花费50分钱,此时:</p>\n\n<p>1)最大购买数量为:2*50=100g</p>\n\n<p>2)先给定两个1克的盒子:1g*2,容量:2g</p>\n\n<p>如果每人购买2g,则还需要1个2g的盒子(前面已给出),此时容量为4g</p>\n\n<p>如果每人购买3g,则总共需要可装6g的盒子,此时的问题依然是:如何确定下一个盒子?</p>\n\n<p>确定方法:(6-4)/3=0.67,向上取整为1,所以还需要1个3g的盒子,此时容量为7g</p>\n\n<p>如果每人购买4g,则需要可装8g的盒子,此时的问题依然是:如何确定下一个盒子?</p>\n\n<p>确定方法:(8-7)/4=0.25,向上取整为1,所以还需要1个4g的盒子,此时容量为11g</p>\n\n<p>如果每人购买6g,则需要可装12g的盒子,此时的问题依然是:如何确定下一个盒子?</p>\n\n<p>确定方法:(12-11)/6=1/6,向上取整为1,所以还需要1个6g的盒子,此时容量为17g</p>\n\n<p>为什么是:如果每人购买6g?因为每次“如果”,都要使需要的容量超过了前一次的容量。</p>\n\n<p>......</p>\n\n<p>以此类推,直到容量大于等于100g,最终发现需要的盒子数量是11个,规格为:1g*2,2g*1,3g*1,4g*1,6g*1,......</p>\n\n<p>这就是这个问题的基本思路。</p>\n\n<p><strong>代码可以参考:</strong></p>\n\n<pre>\n<code class=\"language-cpp\">#include<iostream>\n#include<cmath>\nusing namespace std;\n\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}</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"
}