题目地址:
https://www.luogu.com.cn/problem/P1909
根据题目要求,P老师需要购买超过n支铅笔才够给小朋友们发礼物,并且要买同一种包装的铅笔。我们可以通过以下步骤来解决:
1.读取输入,得到需要的铅笔数量n和三种包装的信息。
2.初始化最小花费为一个较大的值,比如1000000000。
3.遍历三种不同的包装,分别计算购买该种包装所需的花费,如果购买的铅笔数量大于等于n,更新最小花费。
4.输出最小花费。
代码如下:
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
int cost = 1000000000;//初始化最小花费为一个较大的数
for (int i = 0; i < 3; i++)
{
int pencils, price;
scanf("%d %d", &pencils, &price);
int packs = (n + pencils - 1) / pencils;//计算购买该种包装所需的包数
int currentcost = packs * price;//计算购买该种包装的总花费
if (currentcost < cost)
{
cost = currentcost;//更新最小花费
}
}
printf("%d\n", cost);
return 0;
}
该代码使用了基础的贪心算法来解决。
贪心算法是一种在每个步骤选择当前最优解的策略,以期望最终得到全局最优解的算法。在该题中,我们需要选择最小花费的包装来购买足够数量的铅笔。
具体来说,我们遍历三种包装,计算购买每种包装所需的包数,并计算总花费。然后,我们更新最小花费,选择最小的花费作为当前最优解。通过这种方式,我们逐步选择最优解,直到遍历完所有的包装。最终,我们得到的最小花费就是全局最优解。
其中,我们通过(n + pencils - 1) / pencils来计算购买某种包装所需的包数。假设铅笔总数为n,每包铅笔的数量为pencils。如果n是pencils的整数倍,那么购买n个铅笔需要n/pencils包。但是,如果不是pencils的整数倍,外卖需要向上取整,即需要n/pencils向上取整的报数。
为了实现向上取整,外卖可以使用(n + pencils - 1) / pencils来计算包数。这样,如果n是pencils的整数倍,那么(n + pencils - 1) / pencils = n / pencils,向上取整和向下取整的结果相同。但是,如果n不是pencils的整数倍,那么(n + pencils - 1) / pencils会向上取整,得到比n / pencils更大的包数。