洛谷 P2085 & WUSTOJ 1921 最小函数值 【优先队列】

题目来源
WUSTOJ :http://acm.wust.edu.cn/problem.php?id=1921&soj=0
洛谷:https://www.luogu.org/problemnew/show/P2085
在这里插入图片描述
★其实这题用写更快,据说8ms可以过。我这个方法要20ms qwq,我这个菜鸡不会那些花里胡哨的东西吖

相关知识:

初中数学函数方面的,不知道你们忘了没233.当a,b,c都为正整数是,二次函数在x轴正半轴一定是单调递增的。

思路:

首先让x=1时的函数值都入队,然后取栈顶,栈顶一定是最小的。然后通过一定的手段,把栈顶的那个函数的x变为2,再入队。以此循环m次即可,具体看代码叭~

注意:

记得清空队列,否则会出问题的。
不能直接m次循环,最后一次或第一次要单独拿出来,不然最后面多空格会PE

代码:

#include<bits/stdc++.h>
using namespace std;
struct data     //记录a,b,c 并把x初始化为1
{
    int a,b,c;
    int x;
}f[10005];
struct num
{
    int y;
    int id;
    friend bool operator < (struct num aa,struct num bb) {return aa.y>bb.y;} //越小优先级越高
};
priority_queue<struct num> q;
int main()
{
    int n,m;
    while(cin>>n>>m){
        while(q.size()) q.pop();    //清空队列,不然可能会出错
        for(int i=1;i<=n;i++){
            cin>>f[i].a>>f[i].b>>f[i].c;
            f[i].x=1;
            struct num s;
            s.y=f[i].a*f[i].x*f[i].x+f[i].b*f[i].x+f[i].c;
            s.id=i;        //这就是我说的手段的关键
            q.push(s);
        }
        for(int i=1;i<m;i++){    //m-1次
            struct num s=q.top();
            q.pop();
            cout<<s.y<<' ';
            f[s.id].x++;    // x自增后再入队 在这里凸显
            s.y=f[s.id].a*f[s.id].x*f[s.id].x+f[s.id].b*f[s.id].x+f[s.id].c;
            q.push(s);
        }
        struct num s=q.top();   //最后一次
        q.pop();
        cout<<s.y<<endl;
    }
}

以后也许会补上用堆写的 代码,也许!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值