贪心,优先队列

由于函数的所有系数都是正的,函数 $F_{i}(x)$ 的值随着 $x$ 值的增长而增长。做法依赖这个性质。

首先取出所有 $F_i(1)$ 的值放入优先队列,然后取出其中最小的记为 $F_x(1)$,接着把 $F_x(2)$ 加入优先队列。重复该操作 $m$ 次。

由于 $n,m$ 同阶,时间复杂度 $O(n \log n)$。

#include<bits/stdc++.h>
using namespace std;
struct Function{
    int a,b,c,p;
    Function(int x,int y,int z,int _p):a(x),b(y),c(z),p(_p){}
    long long operator()(int x)const{
        return 1ll*a*x*x+1ll*b*x+c;
    }
    bool operator<(const Function &x)const{
        return this->operator()(p)>x.operator()(x.p);
    }
};
priority_queue<Function> q;
int n,m;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        static int x,y,z;
        cin>>x>>y>>z;
        q.push(Function(x,y,z,1));
    }
    for(int i=1;i<=m;i++){
        auto x=q.top();q.pop();
        cout<<x(x.p)<<' ';
        ++x.p,q.push(x);
    }
    return 0;
}
最后修改:2024 年 09 月 04 日
如果觉得我的文章对你有用,请随意赞赏