蓝桥杯 Candy Store

Candy Store

问题描述
  经营一家糖果店是非常困难的,你需要优化各种各样的东西。最近你在销售一种非常时髦的糖果,叫做Whizboppers。这种糖果变质非常迅速,所以:
  ·你必须每天早上从供应商买来新的Whizboppers。
  ·你必须用当天早上从供应商买来的盒子装着糖果出售。

你可以从你的供应商处买来装有任意整数克糖果的盒子。
  每天有至多k位顾客到你的店里来。从第1个人开始,每个人会选择花费整数分的钱来买Whizboppers,钱数在1分到C分之间(包含1分和C分)。你打算以1分钱每克的价格出售;所以如果一个人想要花4分钱,你会给他恰好4克糖果。你可以给他1个4克的盒子,也可能是1个2克的盒子和2个1克的盒子。
  你最少需要买几个盒子才能保证,不管每个人想花多少钱买糖,你总是可以给他们对应质量的糖果?

注意:当一个人选择自己想买多少糖果后,你知道之前的人已经买了多少糖,但不能预知之后的人打算买多少糖。
  举个例子,如果每天至多有2位顾客到你的店里,每个人至多花2分钱(k=2,C=2),你可以从你的供应商买4个1克的盒子。但是你可以做的更好:只要买2个1克的盒子和1个2克的盒子,就可以满足你的顾客。
   不论第一个人怎么买,你都可以给他对应质量的盒子,同时保证第二个人也能拿到正确质量的糖果。所以对于k=2,C=2,你用3个盒子就可以满足任意的顾客需求。
输入格式
  第一行一个整数T,表示询问数量。
  接下来T行,每行包含两个整数k和C,分别表示最大人数和每个人花费的最多钱数。
输出格式
  对于每一个询问,输出一行包含"Case #x: y",x是询问编号(从1开始标号),y是你每天最少需要的盒子数量。
样例输入
4
1 5
2 2
10 3
2 50
样例输出
Case #1: 3
Case #2: 3
Case #3: 19
Case #4: 11
数据规模和约定
  对于25%的数据,k<=20,C<=3;
  对于另外20%的数据, k<=1000,C<=10;
  对于另外5%的数据,k=1;
  对于100%的数据,1 <= T <= 100,1 <= k <= 1000,1 <= C <= 10^12。

思路

以2 50这组数据为例

盒子规格及个数 盒子可装总重量
1g*2 2g
2g*1 4g
3g*1 7g
4g*1 11g
6g*1 17g
9g*1 26g
14g*1 40g
21g*1 61g
31g*1 92g
47g*1 139g

直到可装总重量超过k×c为止,这里是2×50=100,当139>100时停止,总个数加起来为11。
要考虑的是:如何选择下一个盒子的规模?
当盒子可装的总规模小于k个顾客都买x克糖时,则下一个盒子规模即为x。(1<=x<=c)如在上述例子中,当盒子可装总重达到17g时,如果两个人都买9g,则需要18g的盒子,且18>17,于是下一个盒子需要是9g。而所需盒子的个数为重量差除以盒子规模再上取整,这里为(18-17)/9,上取整后为1。即需要增加1个9g的盒子。

题目测评

代码(C++)

#include<iostream>
#include<cmath>
using namespace std;

int main()
{
	int n, k, count = 1;
	long long c;
	cin >> n;
	while (n--)
	{
		cin >> k >> c;
		int num = k; //num用来储存盒子个数,如果都买1g,则至少需要k个1g的盒子
		long long sum = k; //用来储存盒子所能装的总重
		for (long long i = 2; i <= c; i = sum / k + 1)//要用之前的思路直接定位下一个i,如果用i++一个一个试会超时
		{
			int t = num;
			num += ceil((k * i - sum) * 1.0 / i);
			sum += i * (num - t);
		}
		cout << "Case #" << count++ <<": " << num << endl;
	}
	return 0;
}

你可能感兴趣的:(蓝桥杯 Candy Store)