蓝桥杯真题 - 最大开支 - 题解

题目链接:https://www.lanqiao.cn/problems/3541/learning/

个人评价:难度 3 星(满星:5)

前置知识:贪心,结构体


整体思路

  • 根据题目名可知,虽然题目问的是"至少需要准备多少钱",但实际要求的是"最大开支",即所有人都按最贵的方式选择项目;
  • 由于参与项目的人数不同将决定项目的单价,不能直接按单价贪,考虑按增量贪心,即:如果第 i i i 个项目新加入一个成员,需要选择对答案增量最大的项目,这样才能使最终开支最大;
  • 首先计算在第 x x x 名成员加入第 i i i 个项目之前需要的开支 b e f o r e before before,即:

b e f o r e = { 0 x = 1 max ⁡ ( K i ( x − 1 ) + B i , 0 ) × ( x − 1 ) x ≠ 1 before= \begin{cases} 0 & x = 1 \\ \max(K_i (x - 1) + B_i, 0) \times (x - 1) & x \neq 1 \end{cases} before={0max(Ki(x−1)+Bi,0)×(x−1)x=1x=1

  • 其次计算第 x x x 名成员加入第 i i i 个项目之后需要的开支 a f t e r after after:

a f t e r = max ⁡ ( K i × x + B i , 0 ) × x after=\max(K_i \times x + B_i, 0) \times x after=max(Ki×x+Bi,0)×x

  • a f t e r − b e f o r e after-before after−before 就是第 x x x 个成员加入后的增量,每个成员贪心取最大的增量,使用优先队列维护即可。

过题代码

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

typedef long long LL;
const int maxn = 100000 + 100;
struct Node {
    LL k, b, x, d;
    Node() {}
    
    // 计算增量 d
    Node(LL k, LL b, LL x) : k(k), b(b), x(x) {
        LL before = 0;
        if (x != 1) {
            before = max(k * (x - 1) + b, 0LL) * (x - 1);
        }
        d = max(k * x + b, 0LL) * x - before;
    }
};

bool operator<(const Node &a, const Node &b) {
    return a.d < b.d;
}

int n, m, k, b;
LL ans;
priority_queue<Node> que;

int main() {
#ifdef ExRoc
    freopen("test.txt", "r", stdin);
#endif // ExRoc
    ios::sync_with_stdio(false);

    cin >> n >> m;
    for (int i = 1; i <= m; ++i) {
        cin >> k >> b;
        que.push(Node(k, b, 1));
    }
    for (int i = 1; i <= n; ++i) {
        Node tmp = que.top();
        que.pop();
        // 如果增量 <= 0,说明再取将会减少答案,此时让后面的人不再参与项目才能得到最大开支
        if (tmp.d <= 0) {
            break;
        }
        ans += tmp.d;
        tmp = Node(tmp.k, tmp.b, tmp.x + 1);
        que.push(tmp);
    }
    cout << ans << endl;

    return 0;
}
相关推荐
Jerry44 分钟前
LeetCode 101. 对称二叉树
算法
可编程芯片开发2 小时前
基于MPPT最大功率跟踪的离网光伏发电系统Simulink建模与仿真
算法
AI科技星2 小时前
线性算子不是空间映射函数,是全域双螺旋场之间拉伸、旋转、耦合、坍缩的跨空间标准化变换载体《全域数学vs传统数学:人类文明进阶200讲》第80讲
线性代数·算法·矩阵·数据挖掘·回归·乖乖数学·全域数学
米罗篮2 小时前
矩阵快速幂 (Exponentiation By Squaring Applied To Matrices)
c++·线性代数·算法·矩阵
肖爱Kun2 小时前
C++设计策略模式
开发语言·c++·策略模式
dream_home84072 小时前
图像算法模型NPU适配与算法服务实战指南
人工智能·python·算法·npu 图像服务
大鱼>3 小时前
多宠物家庭智能管理平台:云端架构与多设备协同实战
python·算法·iot·宠物
炸膛坦客3 小时前
单片机/C/C++八股:(二十四)编译文件( .bin 和 .hex ,包括 .elf 和 .axf )
c语言·c++·单片机
To_OC3 小时前
LC 22 括号生成:刷完这道题,我终于搞懂回溯剪枝了
javascript·算法·leetcode
To_OC4 小时前
LC 39 组合总和:回溯入门必刷题,我踩过的两个坑都在这了
javascript·算法·leetcode