当前位置: 首页 > news >正文

1370:最小函数值(minval)——优先队列

【题目描述】
有n个函数,分别为F1,F2,…,Fn。定义Fi(x)=Aix2+Bix+Ci(x∈N∗)。给定这些Ai、Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个)。

【输入】
第一行输入两个正整数n和m。

以下n行每行三个正整数,其中第i行的三个数分别位Ai、Bi和Ci。输入数据保证Ai<=10,Bi<=100,Ci<=10000。

【输出】
将这n个函数所有可以生成的函数值排序后的前m个元素。这m个数应该输出到一行,用空格隔开。

【输入样例】
3 10
4 5 3
3 4 5
1 7 1
【输出样例】
9 12 12 19 25 29 31 44 45 54
【提示】
【数据规模】

n,m≤10000。

分析

  1. 此题一看就用小根堆,通过枚举x,去将计算的函数值放入队列,但是放多少个呢,起初while循环条件是q.size() <= m 但是这样不对,因为可能前面的函数式用下一个x会比后面的函数用当前x计算出的值更小,于是用了个nm但是RE+TLE,后来试了个100m过了,但是可能是凑巧过了,此题一共有n*m个函数值,所以也可以采用大根堆来实现;
  2. 用大根堆时候,只要队列元素不够m个,就直接加进去,否则就进行判断是否加入队列(维护一个只有m个元素的队列,解法一维护的是100*m个元素的队列);

小根堆

采用的是,枚举一个x,求出所有的函数值

#include <bits/stdc++.h>

using namespace std;

const int N = 10010;
//小根堆
priority_queue<int, vector<int>, greater<int>> q;
int n, m;
int a[N], b[N], c[N];

int main() {
    cin.tie(0);
    cin >> n >> m;
    for (int i = 0; i < n; ++i) {
        cin >> a[i] >> b[i] >> c[i];
    }
    int x = 1;//枚举x
    while (q.size() <= 100 * m) {
        for (int i = 0; i < n; ++i) {
            q.push(a[i] * x * x + b[i] * x + c[i]);
        }
        x++;
    }
    while (m--) {
        cout << q.top() << " ";
        q.pop();
    }
    return 0;
}



大根堆

遍历每个函数,对每个函数枚举m个x值;

#include <bits/stdc++.h>

using namespace std;

const int N = 10010;
//大根堆
priority_queue<int> q;
int n, m;
int a[N], b[N], c[N], ans[N];

int main() {
    cin.tie(0);
    cin >> n >> m;
    for (int i = 0; i < n; ++i) {
        cin >> a[i] >> b[i] >> c[i];
    }
    //n个函数,每个函数枚举m个x的取值
    for (int i = 0; i < n; ++i) {
        //枚举x
        for (int x = 1; x <= m; ++x) {
            int f = a[i] * x * x + b[i] * x + c[i];
            if (q.size() < m)
                q.push(f);
            else {
                if (f < q.top()) {
                    q.pop();
                    q.push(f);
                }
            }
        }
    }

    for (int i = 0; i < m; ++i) {
        ans[i] = q.top();
        q.pop();
    }
    for (int i = m - 1; i >= 0; --i) {
        cout << ans[i] << " ";
    }
    return 0;
}



相关文章:

  • 学习工业设计,你需要知道这些
  • 【Python基础入门6】Python的输入与运算符
  • 微服务分布式开源架构是什么?
  • Oracle触发器设置
  • 广州市车联网先导区LTE-V2X 车载直连通讯设备技术规范
  • 运维技术linux、nginx
  • 数字逻辑设计(2)
  • tars架构
  • 数据结构算法之贪心算法,贪心算法之区间调度问题
  • Spark Rdd之mapToPair,flatMapToPair
  • nodejs项目实例知识信息分享平台
  • Python类和对象怎么使用
  • 【我不熟悉的css 】02. 手动画一个svg图片
  • 一、特征工程
  • 超详细Redis入门教程三
  • Google 是如何开发 Web 框架的
  • #Java异常处理
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • ES6系统学习----从Apollo Client看解构赋值
  • js操作时间(持续更新)
  • magento2项目上线注意事项
  • mysql 数据库四种事务隔离级别
  • Python学习之路16-使用API
  • storm drpc实例
  • Vim Clutch | 面向脚踏板编程……
  • 从0到1:PostCSS 插件开发最佳实践
  • 机器学习学习笔记一
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 容器服务kubernetes弹性伸缩高级用法
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 一个JAVA程序员成长之路分享
  • 赢得Docker挑战最佳实践
  • 在weex里面使用chart图表
  • Nginx实现动静分离
  • puppet连载22:define用法
  • 组复制官方翻译九、Group Replication Technical Details
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (Python) SOAP Web Service (HTTP POST)
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • 、写入Shellcode到注册表上线
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .net6Api后台+uniapp导出Excel
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .Net接口调试与案例
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • []利用定点式具实现:文件读取,完成不同进制之间的
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]
  • [ABC294Ex] K-Coloring
  • [Bugku]密码???[writeup]