题目来源
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;
}
}
以后也许会补上用堆写的 代码,也许!