贪心,优先队列
由于函数的所有系数都是正的,函数 $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;
}