蓝桥杯(C++ 最大开支 优先队列)

优先队列: 蓝桥杯(C++ 整数删除 优先队列 )-CSDN博客

思路:

1、每个人依此选择项目,每个人选项目时都(选择当下花费增加最多的项目),若项目i的门票价格为kx+b,那么增加一个人选择的花费为:increase =(k*(x+1)+b)*(x+1)- ((k*x)+b)*x x = k(2x+1) + b

2、可以用优先队列存项目的k、b、x(选择这个项目的人数)、increase(当前项目人数增加为x+1所增加的花费),使increase最大的项目排在队首,每加一个人出队一个并使总花费增加increase,即总花费money = money + increase

3、更新x和increase,若increase > 0重新入队,若increase <= 0不重新入队(人数到了开口向下的二次函数的对称轴,花费开始下降,不能再增加人数了

代码:

cpp 复制代码
#include<iostream>
#include<queue>
#include<functional>
using namespace std;
using ll = long long;
struct node
{
    int k, b, x , increase;
};
bool operator < (const struct node a, const struct node b)//重载<
{
    return a.increase < b.increase;
}
int main()
{
    int n, m;
    cin >> n >> m;
    priority_queue<node>h;//大根堆
    node a;
    for (int i = 0; i < m; i++)
    {
        cin >> a.k >> a.b;
        a.increase = a.k + a.b;
        if (a.increase <= 0)//小于等于零的不入队
            continue;
        a.x = 1;
        h.push(a);
    }
    ll money = 0, person;
    for (person = 0; !h.empty() && person < n; person++)
    {
        if (h.top().increase > 0)//防止第一个就小于零
        {
            node temp = h.top();
            h.pop();
            money += temp.increase;//加上增加的花费
            //increase=(k*(x+1)+b)*(x+1)-((k*x)+b)*x 再增加一个人会不会比之前花费更多
            temp.increase = temp.k * (2 * temp.x + 1) + temp.b;
            if (temp.increase > 0)//比之前还更多,重新入队
            {
                temp.x += 1;
                h.push(temp);
            }
        }
        else
            break;
    }
    cout << money;
}
相关推荐
艾莉丝努力练剑6 分钟前
【Linux指令 (二)】不止于入门:探索Linux系统核心与指令的深层逻辑,理解Linux系统理论核心概念与基础指令
linux·服务器·数据结构·c++·centos
深栈15 分钟前
机器学习:支持向量机
算法·机器学习·支持向量机
Mr_WangAndy18 分钟前
C++设计模式_结构型模式_外观模式Facade
c++·设计模式·外观模式
FreeBuf_25 分钟前
Happy DOM曝CVSS 9.4严重RCE漏洞,PoC已公开(CVE-2025-61927)
java·c语言·c++·python·php
刘海东刘海东26 分钟前
结构型智能科技理论研究(草稿)
科技·算法
BlackQid28 分钟前
深入理解指针Part4——字符、数组与函数指针变量
c++·后端
C嘎嘎嵌入式开发36 分钟前
(10)100天python从入门到拿捏《Python中的数据结构与自定义数据结构》
数据结构·python·算法
熬了夜的程序员38 分钟前
【LeetCode】69. x 的平方根
开发语言·算法·leetcode·职场和发展·动态规划
Niuguangshuo1 小时前
音频特征提取算法介绍
算法·音视频
Vect__1 小时前
从底层到上层的“外挂”:deque、stack、queue、priority_queue 全面拆解
数据结构·c++