/*我们可以套用这个策略:列出所有“购买方式/组合方式” 单买: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最小