/*我们可以套用这个策略:列出所有“购买方式/组合方式”
单买:1单位,价格 a
套餐:k个一组,价格 b
设变量 k 表示组数(通常选大的单位,枚举组数更快)
枚举 k,每次用公式算出需要多少补货(如单买),计算总价
从所有结果中取最小值
*/
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
long long a, b, x;
cin >> a >> b >> x; // 读入:a元单买,b元买3只,目标是至少x只
long long cost = 1LL << 60; // 初始化一个超级大的数,表示最小费用
// 枚举套餐数量:k = 套餐买几组(每组3只)
for (long long k = 0; k <= x / 3 + 1; ++k) {
long long num_b = k;
long long num = 3 * num_b;
// 剩下要用单买补多少只
long long num_a = max(0LL, x - num);
// 当前方案的总费用
long long cur_cost = b * num_b + a * num_a;
// 更新最小花费
cost = min(cur_cost, cost);
}
// 输出最小费用
cout << cost << endl;
return 0;
}
循环有点难,从套餐入手,最多买x/3组,“至少”可以加两个防止越界。然后剩下的都用单买,看看这些组合里哪个cost最小

京公网安备 11010502036488号