题目大意
有n个函数,分别为F1,F2,...,Fn。定义Fi(x)=Ai*x^2+Bi*x+Ci (x,Ai,Bi,Ci∈N*)。给定这些Ai、Bi和Ci,请求出所有函数的所有函数值中最小的m个。
题解
审题!$A_i, B_i>0$!这说明对称轴在y轴左侧!所以正半轴上x值是单调递增的!这样我们就可以想到用单调队列来解决这个问题了。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int MAX_N = 10010;
struct Func
{
int a, b, c;
int x, y;
void GetY()
{
y = a * x * x + b * x + c;
}
bool operator < (const Func &a) const
{
return y > a.y;
}
}_fs[MAX_N];
int main()
{
int totFunc, outCnt;
scanf("%d%d", &totFunc, &outCnt);
for (int i = 1; i <= totFunc; i++)
{
scanf("%d%d%d", &_fs[i].a, &_fs[i].b, &_fs[i].c);
_fs[i].x = 1;
_fs[i].GetY();
}
static priority_queue<Func> q;
for (int i = 1; i <= totFunc; i++)
q.push(_fs[i]);
while (outCnt--)
{
Func cur = q.top();
q.pop();
printf("%d ", cur.y);
cur.x++;
cur.GetY();
q.push(cur);
}
printf("\n");
return 0;
}